Java新手。按任何按钮时计算器程序出现奇怪错误

时间:2013-10-16 18:03:51

标签: java user-interface calculator eventqueue

我现在只使用Java大约一个月了,所以我还没有完全掌握它。我被分配到一个带有GUI的计算器程序。除了用户可以输入多个小数点这一事实外,我得到了一切。所以我试图解决这个问题(我没有),现在程序将运行没有任何错误,但每当我点击一个按钮,如1,2,3,或运算符,如+, - 等,我得到以下错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at inlab05.InLab05$event.actionPerformed(InLab05.java:190)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6505)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
    at java.awt.Component.processEvent(Component.java:6270)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4861)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:708)
    at java.awt.EventQueue$4.run(EventQueue.java:706)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

以下是我认为错误所在的代码部分:

public class event implements ActionListener {

    public void actionPerformed(ActionEvent a) {
        String text = a.getActionCommand();


        if (text.equals("1")) {
            result.setText(result.getText() + "1");
        } else if (text.equals("2")) {
            result.setText(result.getText() + "2");
        } else if (text.equals("3")) {
            result.setText(result.getText() + "3");
        } else if (text.equals("4")) {
            result.setText(result.getText() + "4");
        } else if (text.equals("5")) {
            result.setText(result.getText() + "5");
        } else if (text.equals("6")) {
            result.setText(result.getText() + "6");
        } else if (text.equals("7")) {
            result.setText(result.getText() + "7");
        } else if (text.equals("8")) {
            result.setText(result.getText() + "8");
        } else if (text.equals("9")) {
            result.setText(result.getText() + "9");
        } else if (text.equals("0")) {
            result.setText(result.getText() + "0");
        } else if (text.equals(".")) {
            result.setText(result.getText() + ".");
        }


        String str = result.getText();
        textBox = Double.parseDouble(str);

        if (a.getSource()
                == textAdd) {
            op = 1;
            firstInput = textBox;
            result.setText("");
        }

        if (a.getSource()
                == textSubtract) {
            op = 2;
            firstInput = textBox;
            result.setText("");
        }

        if (a.getSource()
                == textMultiply) {
            op = 3;
            firstInput = textBox;
            result.setText("");
        }

        if (a.getSource()
                == textDivide) {
            op = 4;
            firstInput = textBox;
            result.setText("");
        }

        if (a.getSource()
                == textPercent) {
            op = 5;
            firstInput = textBox;
            result.setText("");
        }

        if (a.getSource()
                == textSqrt) {
            op = 6;
            firstInput = textBox;
            answer = Math.sqrt(textBox);
            str = Double.toString(answer);
            result.setText(str);
        }

        if (a.getSource()
                == textSign) {
            double neg;
            op = 7;
            neg = 0 - textBox;
            str = Double.toString(neg);
            result.setText(str);
        }

        if (a.getSource()
                == textEqual) {
            if (op == 1) {
                answer = firstInput + textBox;
                str = Double.toString(answer);
                result.setText(str);
            } else if (op == 2) {
                answer = firstInput - textBox;
                str = Double.toString(answer);
                result.setText(str);
            } else if (op == 3) {
                answer = firstInput * textBox;
                str = Double.toString(answer);
                result.setText(str);
            } else if (op == 4) {
                answer = firstInput / textBox;
                str = Double.toString(answer);
                result.setText(str);
            } else if (op == 5) {
                answer = firstInput % textBox;
                str = Double.toString(answer);
                result.setText(str);
            }

        }
    }
}

其余的代码是GUI,什么不是。

有谁知道这可能是什么?我不记得在我试图修正我的小数点问题时更改了我所知道的任何内容,并且我将代码更改回原来上次工作时的代码

错误表明它出现在第190行result.setText(result.getText() + "1");

当然,如果我点击一个不同的按钮,行号会改变,这只是一个例子,如果用户按下了数字1按钮

很抱歉这么长的帖子希望你们能帮忙:)。

2 个答案:

答案 0 :(得分:0)

如果使用任何类型的IDE(Eclipse,NetBeans,...),您甚至可以单击 InLab05.java:190 部分

at inlab05.InLab05$event.actionPerformed(InLab05.java:190)

并将直接带你到NullPointerException发生的地方。

答案 1 :(得分:0)

  

错误说它出现在第190行,即result.setText(result.getText()+“1”);

因此,程序中此位置的结果变量 为空。您需要回顾一下代码,看看为什么它没有在这个范围/上下文中初始化。


编辑1
在整个代码中搜索结果变量。尚未初始化在违规行上使用的变量。注意变量阴影,尽管在构造函数或方法中重新声明了类的字段。


编辑2
你说:

  

在我初始化结果变量的地方(JTextField result = new JTextField();)结果用黄色下划线表示“Local变量隐藏一个字段”,它给我的唯一选项是重命名变量。这可能与它有关吗?

是。你正在做我担心你可能正在做的事情。通过在该位置重新声明结果变量,您最终初始化一个局部变量,其范围仅在声明它的方法或构造函数中,并且该类中的字段保持为null。从以下地址更改该行:

JTextField result = new JTextField(); // re-declaring variable here

到:

result = new JTextField(); // not re-declaring variable here