1

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 :)

Mark Shimala
  • 65
  • 10
  • What's strange about the error? – Sotirios Delimanolis Oct 16 '13 at 18:04
  • 1
    `"And here is the part of the code where I believe the error lies: ..."` -- You know **exactly** where the error lies as the JVM tells you that it is occurring here: `InLab05.java:190` at line 190 of InLab05.java. Please show the code for this class and indicate which line is this one. You are trying to de-reference / call a method on a variable with a null reference on that line. – Hovercraft Full Of Eels Oct 16 '13 at 18:08
  • 1
    `if (text.length() == 1 && "1234567890.".contains(text)) result.setText(result.getText() + text)` replaces all your fancy `if else` construct – zapl Oct 16 '13 at 18:14
  • Thanks @zapl I did that and I still get the same error. It is nice to know the shorter route of doing that though. Also I edited the post to show what line the error occurs on – Mark Shimala Oct 16 '13 at 18:50

2 Answers2

0

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.

alterfox
  • 1,675
  • 3
  • 22
  • 37
0

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
Hovercraft Full Of Eels
  • 283,665
  • 25
  • 256
  • 373
  • Hm, I'm not sure where that would be since I don't remember changing anything. I'll take a closer look at it right now – Mark Shimala Oct 16 '13 at 18:56
  • @MarkShimala: 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. – Hovercraft Full Of Eels Oct 16 '13 at 18:57
  • 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? – Mark Shimala Oct 16 '13 at 19:10
  • @MarkShimala: you're welcome. Look up "Variable Shadowing" for more on this problem. – Hovercraft Full Of Eels Oct 16 '13 at 19:23