在jpanel中解析输入,编译很好但没有运行。请解释

时间:2016-09-16 03:45:39

标签: java jlabel

代码:

 import javax.swing.*;
 import java.util.*;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JTextField;
 import javax.swing.SwingConstants;

public class check2
{
public static void main(String[] args) {

String array1[], 
        array2[],
        array3[], 
        array4[];
Double hours[],
        pay[],
        total[],
        sum[], 
        over[],
        social[];

array1= new String [5];
array2= new String [5];
array3= new String [5];
array4= new String [5];

social = new Double [5];
hours= new Double [5];
pay= new Double [5];
total= new Double [5];
sum= new Double [5];
over= new Double [5];


  JTextField name = new JTextField(5);
  JTextField ss = new JTextField(5);
   JTextField hw = new JTextField(5);
JTextField wage = new JTextField(5);

  JPanel myPanel = new JPanel();
myPanel.setLayout(new BoxLayout(myPanel,BoxLayout.Y_AXIS));
myPanel.add(Box.createVerticalStrut(20));

for (int i = 0;i<5 ;i++ )
{

  myPanel.add(new JLabel("Name: "));
  myPanel.add(name);
  myPanel.add(new JLabel("Social Security:"));
  myPanel.add(ss);
  myPanel.add(new JLabel("Hours Worked:"));
  myPanel.add(hw);
  myPanel.add(new JLabel("Wage:"));
  myPanel.add(wage);

array1[i]=name.getText();
array2[i]=ss.getText();
social[i]=Double.parseDouble(array2[i]);
array3[i]=hw.getText();
hours[i]=Double.parseDouble(array3[i]);
array4[i]=wage.getText();
pay[i]=Double.parseDouble(array4[i]);

}

for (int u=0;u<5 ;u++ )
{
  if (pay[u] < 40)
    {
    total[u] = pay[u] * hours[u];
System.out.println (array1[u] + " gross pay is " + total[u]);   
    }
else if (hours[u] > 40)
        {
hours[u] = hours[u] - 40;
sum[u]= 40 * pay[u];
over[u]= hours[u] * pay[u] * 1.5;
total[u] = sum[u] + over[u];
        }
}



  int result = JOptionPane.showConfirmDialog(null, myPanel, 
           "Please Enter details", JOptionPane.OK_CANCEL_OPTION);
  if (result == JOptionPane.OK_OPTION) {
     System.out.println("name: " + name.getText());
     System.out.println("Social security: " + ss.getText());
      System.out.println("hours worked: " + hw.getText());
       System.out.println("Total pay: " + wage.getText());

       for (int a=0;a<5 ;a++ )
       {
           JFrame window = new JFrame("FrameDemo");
           JLabel first = new JLabel ("name:" +array1[a]);
           first.setBounds(250,20,100,10);
           JLabel Totalpay = new JLabel("pay: " +total[a]);
            Totalpay.setBounds(250, 20, 100, 10);
           JLabel bank = new JLabel ("" +social[a]);
           bank.setBounds (0,90,100,10);
           window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             window.setSize(400, 150);
            window.setVisible(true);
             window.setLayout(null);
            window.setResizable(false);
         window.add(first);
        window.add(bank);
       }
    }
 }
}

编译好。 输出:

 ---------- runn ----------
Exception in thread "main" java.lang.NumberFormatException: empty String
 at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)
 at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
 at java.lang.Double.parseDouble(Double.java:538)
 at check2.main(check2.java:60)

我是java的初学者,刚刚学习了jpanel。我对发生的事情有几个问题,对不起,如果它们很明显的话。我一直在做很多关于那个错误的研究。我发现它试图将像“adam”这样的字符串解析为double。当用户将值输入jpanel时,是否自动假设它是一个字符串?如果是这样,解析后的线条不应该吗? 例如:

 myPanel.add(new JLabel("Wage:"));
 myPanel.add(wage);
 array4[i]=wage.getText();
 pay[i]=Double.parseDouble(array4[i]);

` 对不起,因为数组可能很难说出上下文。这就是为什么我包括我的所有代码。我让这个程序在循环和数组之前工作。我只是没有看到矛盾。如果有人能解释我做错了什么,我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

我可以看到您的代码存在多个问题。但是我会深入了解你为什么会遇到异常&#39; NumberFormatException&#39;。

在您的代码中myPanel.add(ss);(第52行)会将JTextField添加到您的JPanel中。 array2[i]=ss.getText();(第59行)将此文本字段中的值赋给array2 [i]。 但是,该文本字段还没有值。因此,为array2 [i]分配一个空字符串。现在在第60行,social[i]=Double.parseDouble(array2[i]);,您试图将此空字符串解析为不允许的double值,并抛出异常java.lang.NumberFormatException。