简体   繁体   中英

New to Java. Getting strange error in calculator program when pressing any button

I've only been working with Java for about a month now so I don't exactly have a complete grasp on it yet. I have been assigned to make a calculator program with a GUI for class. I got everything working besides the fact that the user can enter in multiple decimal points. So I tried to fix that problem (which I did not) and now the program will run without any errors but whenever I click a button, such as 1, 2, 3, or an operator such as +, -, etc. I get the following error:

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)

And here is the part of the code where I believe the error lies:

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);
            }

        }
    }
}

The rest of the code is the GUI and what not.

Does anyone know what this could be? I don't remember changing anything that I know of when I was trying to fix my decimal point issue and I changed the code back to how it previously was when it last worked

The error says it occurs at line 190 which is result.setText(result.getText() + "1");

Of course if I click a different button the line number will change, that is just an example if the user pressed the number 1 button

Sorry for such a long post hopefully you guys can help :)

If are using any kind of IDE (Eclipse, NetBeans, ...) you can even click on the InLab05.java:190 part of the

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

and will take you straight where the NullPointerException happens.

The error says it occurs at line 190 which is result.setText(result.getText() + "1");

So the result variable at this location in your program is null. You will need to look back into your code to see why it has not been initialized in this scope/context.


Edit 1
Search throughout your code for the result variable. The variable that is being used on the offending line has not been initialized. Be watchful for variable shadowing though where a field of the class is re-declared in a constructor or method.


Edit 2
You state:

Where I initialize the result variable (JTextField result = new JTextField();) result is underlined in yellow and says "Local variable hides a field" and the only option it gives me is to rename the variable. Could that have something to do with it?

Yes. You're doing exactly what I worried you might be doing. By re-declaring the result variable at that location, you end up initializing a local variable whose scope is only within the method or constructor that it was declared in, and the field in the class remains null. Change that line from:

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

to:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM