如何修复java.lang.NumberFormatException?

时间:2019-04-28 07:10:12

标签: java swing numberformatexception

我正在尝试使用javax.swing。*创建此“综合成绩计算器”。我最近学到的但是,我找不到我的代码有什么问题。我的IDE(Ecliple)没有检测到我的代码中的任何错误,但是当我尝试运行代码时它不会运行。我在哪里弄糟?

BTW:到目前为止,这是我对Java编码的最新知识,因为我是自学成才的,所以我可能不知道任何比这些更高级的代码。

import javax.swing.*;

public class gradeCalcMk3 {

    public static double average(double a, double b, double c, double d) {
        double ave = a*0.3 + b*0.5 + c*0.1 + d*0.1;
        return ave;
    }

    public static void main(String[] args) {

        double grade[] = {0,0,0,0,0};

        JTextField name = new JTextField(10);
        JTextField q = new JTextField(3);
        JTextField ex = new JTextField(3);
        JTextField cs = new JTextField(3);
        JTextField ilm = new JTextField(3);

        JPanel myPanel = new JPanel();
        myPanel.add(new JLabel("Name:"));
        myPanel.add(name);
        myPanel.add(new JLabel("Q:"));
        myPanel.add(q);
        myPanel.add(new JLabel("Ex:"));
        myPanel.add(ex);
        myPanel.add(new JLabel("CS:"));
        myPanel.add(cs);
        myPanel.add(new JLabel("ILM:"));
        myPanel.add(ilm);

        grade[0] = Double.parseDouble(q.getText());
        grade[1] = Double.parseDouble(ex.getText());
        grade[2] = Double.parseDouble(cs.getText());
        grade[3] = Double.parseDouble(ilm.getText());
        grade[4] = average(grade[0], grade[1], grade[2], grade[3]);

        double confirm = JOptionPane.showConfirmDialog
                                (null, myPanel, "Enter Values", JOptionPane.OK_CANCEL_OPTION);
        if(confirm == JOptionPane.OK_OPTION) {
            JOptionPane.showMessageDialog(null, "Name: " + name.getText()
                                              + "\n\nQuiz: " + grade[0]
                                              + "\n\nExam: " + grade[1]
                                              + "\n\nCS: "   + grade[2]
                                              + "\n\nILM: "  + grade[3]
                                              + "Average: " + grade[4]);
        }
    }
}

这是我尝试运行时的输出

Exception in thread "main" java.lang.NumberFormatException: empty String
    at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
    at sun.misc.FloatingDecimal.parseDouble(Unknown Source)
    at java.lang.Double.parseDouble(Unknown Source)
    at gradeCalcMk3.main(gradeCalcMk3.java:32)

3 个答案:

答案 0 :(得分:1)

您将需要更多的时间来完成这项工作。

基本上,所有从文本字段中提取值的代码都需要放置在单击按钮或菜单(或其他激活它)的方法上。也就是说,您至少需要两种方法:“设置表单”方法和“处理输入”方法。

发布时,您的JTextFields不包含文本(您使用的构造函数未设置文本-它设置了“列数”)。

所有文本字段均已创建并添加到表单后,下一步就是从其中提取空字符串,然后尝试将它们解析为双精度型。这将生成您遇到的异常。 由于代码全部包含在一个方法中,因此有 zero 的机会,您可以在读取和处理它们之前在字段中输入任何值。

至少,暂时(暂时)注释掉尝试提取值,解析它们并计算平均值的代码。提取,解析和计算代码之后,可以移到我上面提到的按钮或菜单附带的事件处理程序中。

我希望这会有所帮助。

答案 1 :(得分:0)

创建JTextField的实例时,您只是在使用错误的构造函数

JTextField(int columns) 用指定的列数构造一个新的空TextField。

使用字符串代替,而不是提供整数,例如new JTextField("10")

JTextField(String text) 构造一个使用指定文本初始化的新TextField。

答案 2 :(得分:-1)

Nvm,我发现自己搞砸了,并通过以下方法对其进行了修复:

if(confirm == JOptionPane.OK_OPTION) {

            grade[0] = Double.parseDouble(q.getText());
            grade[1] = Double.parseDouble(ex.getText());
            grade[2] = Double.parseDouble(cs.getText());
            grade[3] = Double.parseDouble(ilm.getText());
            grade[4] = average(grade[0], grade[1], grade[2], grade[3]);

            JOptionPane.showMessageDialog(null, "Name: " + name.getText()
                                              + "\n\nQuiz: " + grade[0]
                                              + "\n\nExam: " + grade[1]
                                              + "\n\nCS: "   + grade[2]
                                              + "\n\nILM: "  + grade[3]
                                              + "Average: " + grade[4]);
        }