2017-04-12 1 views
-2

이것은 하나의 코드 파일입니다 (오류가있는 곳이라고 생각하지만 실수라고 생각합니다.) 런타임 오류는이 파일에있는 "years :"을 언급합니다. 여기에 전체 오류가 있습니다. 스레드 "AWT-EventQueue의-0"java.lang.NumberFormatException의 예외 : 입력 문자열 : "(년) :"여기"AWT-EventQueue-0"스레드에서 예외가 발생했습니다. java.lang.NumberFormatException : 입력 문자열의 경우 : "Years :"

import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

/** 
    A frame that shows the growth of an investment with variable interest, 
    using a bar chart. 
*/ 
public class InvestmentFrame4 extends JFrame 
{ 
    private static final int FRAME_WIDTH = 400; 
    private static final int FRAME_HEIGHT = 400; 

    private static final int CHART_WIDTH = 300; 
    private static final int CHART_HEIGHT = 300; 

    private static final double DEFAULT_RATE = 5; 
    private static final double INITIAL_BALANCE = 1000; 

    private JLabel rateLabelInitialInvestment; 
    private JLabel rateLabelInterestRate; 
    private JLabel rateLabelYears; 
    private JTextField rateFieldInitialInvestment; 
    private JTextField rateFieldInterestRate; 
    private JTextField rateFieldYears; 
    private JButton button; 
    private ChartComponent chart; 
    private double balance; 

    public InvestmentFrame4() 
    { 
    // balance = Double.parseDouble(rateLabelInitialInvestment.getText()); 
     chart = new ChartComponent(3 * INITIAL_BALANCE); 
     chart.setPreferredSize(new Dimension(CHART_WIDTH, CHART_HEIGHT)); 
     chart.append(INITIAL_BALANCE); 

     createInterestRateTextField(); 
     createInitialInvestmentTextField(); 
     createYearsTextField(); 
     createButton(); 
     createPanel(); 

     setSize(FRAME_WIDTH, FRAME_HEIGHT); 
    } 

    private void createInterestRateTextField() 
    { 
     rateLabelInterestRate = new JLabel("Interest Rate: "); 

     final int FIELD_WIDTH = 25; 
     rateFieldInterestRate = new JTextField(FIELD_WIDTH); 
     rateFieldInterestRate.setText("" + DEFAULT_RATE); 
    } 

    private void createInitialInvestmentTextField() 
    { 
     rateLabelInitialInvestment = new JLabel("Initial Investment: "); 

     final int FIELD_WIDTH = 20; 
     rateFieldInitialInvestment = new JTextField(FIELD_WIDTH); 
     rateFieldInitialInvestment.setText("" + DEFAULT_RATE); 
    } 

    private void createYearsTextField() 
    { 
     rateLabelYears = new JLabel("Years: "); 

     final int FIELD_WIDTH = 20; 
     rateFieldYears = new JTextField(FIELD_WIDTH); 
     rateFieldYears.setText("" + DEFAULT_RATE); 
    } 

    class AddInterestListener implements ActionListener 
    { 
     public void actionPerformed(ActionEvent event) 
     { 
     for(int i = 1; i < Integer.parseInt(rateLabelYears.getText().trim()); i++) 
     { 
      balance = Double.parseDouble(rateLabelInitialInvestment.getText()) * Math.pow(1.0 + Double.parseDouble(rateLabelInterestRate.getText()), Integer.parseInt(rateFieldYears.getText())); 
     } 
     }    
    } 

    private void createButton() 
    { 
     button = new JButton("Compound Interest");  

     ActionListener listener = new AddInterestListener(); 
     button.addActionListener(listener); 
    } 

    private void createPanel() 
    { 
     JPanel panel = new JPanel(); 
     panel.add(rateLabelInitialInvestment); 
     panel.add(rateFieldInitialInvestment); 
     panel.add(rateLabelInterestRate); 
     panel.add(rateFieldInterestRate); 
     panel.add(rateLabelYears); 
     panel.add(rateFieldYears); 
     panel.add(button); 
     panel.add(chart);  
     add(panel); 
    } 
} 

다른 파일

public class ChartComponent extends JComponent 
{ 
    private ArrayList<Double> values; 
    private double maxValue; 

    public ChartComponent(double max) 
    { 
     values = new ArrayList<Double>(); 
     maxValue = max; 
    } 

    public void append(double value) 
    { 
     values.add(value); 
     repaint(); 
    } 

    public void paintComponent(Graphics g) 
    { 
     final int GAP = 5; 
     final int BAR_HEIGHT = 10; 

     int y = GAP; 
     for (double value : values) 
     { 
     int barWidth = (int) (getWidth() * value/maxValue); 
     g.fillRect(0, y, barWidth, BAR_HEIGHT); 
     y = y + BAR_HEIGHT + GAP; 
     } 
    } 
} 

에게 있습니다 그리고 마침내 메인

import javax.swing.JFrame; 

/** 
    This program displays the growth of an investment, showing 
    a bar chart. 
*/ 
public class InvestmentViewer4 
{ 
    public static void main(String[] args) 
    { 
     JFrame frame = new InvestmentFrame4(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

누군가가 설명해 주시면 런타임 오류가 발생하여 크게 감사하겠습니다 !!!!

+0

에 오신 것을 환영합니다! 디버거를 사용하는 법을 배워야 할 것 같습니다. [보완적인 디버깅 기술] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)을 참고하십시오. 나중에 문제가 계속되는 경우 문제를 나타내는 [Minimal, Complete and Verifiable Example (http://stackoverflow.com/help/mcve)]을 다시 보내주십시오. –

+0

'Years :'는 숫자로 변환 될 수 없다. 예외를 통해 설명 할 수 있었지만, 실제로 문제가 무엇인지 확신 할 수 없었다.'java.lang.NumberFormatException'에 대한 검색을 시도 했습니까? ? – MadProgrammer

+1

오류가 for 루프 내에 있고, 하나의 레이블에 "years"라는 제목이 있고 그 문자열을 int로 구문 분석하려고하면 텍스트 필드의 텍스트를 가져 왔습니까? –

답변

0

문제는 여기서 발생합니다

for(int i = 1; i < Integer.parseInt(rateLabelYears.getText().trim()); i++) 

rateLabelYears 당신이 그렇지 않으면 변경하지 않는 한 항상 "years"의 텍스트가됩니다 JLabel입니다. 수십 년 동안 입력이 걸리는 JTextField의 식별자 인 rateFieldYears으로 오인했습니다.

이 필요합니다 : 스택 오버플로

for(int i = 1; i < Integer.parseInt(rateFieldYears.getText().trim()); i++){ 
    ... 
    ... 
    ... 
} 
관련 문제