NullPointerException,计算器程序

时间:2014-02-27 16:49:55

标签: java nullpointerexception

我在Java PostFix计算程序中遇到了障碍,到目前为止我无法解决这个问题。特别是,这个程序导致NullPointerException,我无法弄清楚原因。不用多说,这就是。

首先是tokenizer类,它将以空格分隔的字符串解析为字符串标记(理论上,无论如何)。

 import java.io.*;
 import java.util.*;

 public class Tokenizer {

      private Queue<String> tokens;

      public Tokenizer(String input){
           loadString(input);
      }

      public void loadString(String input){
         tokens = new LinkedList<String>();
         String[] toks = input.split(" ");
         for (String s : toks){
             tokens.add(s);
         }
      }

      public Iterator<String> getIterator(){
          return tokens.iterator();
      }
 }

这是我的计算器课......

 import java.util.*;

 public class calculator {

      private static Stack<String> myStack;  // to be accessed by static method

      private static final Set<String> operators = new HashSet<>();
      static {
          operators.add("+");
          operators.add("-");
          // and others
      }

      public static boolean isOperator(String token){
          return operators.contains(token);
      }

      public static float performOperation(String operator, float f1, float f2){
          switch(operator){
              case "+":
                  return f1 + f2;
              case "-":
                  return f1 - f2;
              // and others
          }
       throw new IllegalArgumentException("Unsupported Operator");
       }

       public static float calculate(String expr) throws IllegalArgumentException{
           float result;
           Tokenizer t = new Tokenizer(expr);
           Iterator<String> myIterator = t.getIterator();
           //Begin Calculation
           while (myIterator.hasNext()){
               String myToken = myIterator.next();
               if (!isOperator(myToken)){
                    myStack.push(myToken);
               }
               else {
                   float f1 = Float.parseFloat(myStack.pop());
                   float f2 = Float.parseFloat(myStack.pop());
                   result = performOperation(myToken, f1, f2);
                   myStack.push(result);
               }
               result = Float.parseFloat(myStack.pop());
               return result;
       }
  }

这是stacktrace:

java.lang.NullPointerException
at PostfixCalculator.calculate(PostfixCalculator.java:103)
at PostfixCalculatorTest.calculate(PostfixCalculatorTest.java:30)

第103行是myStack.push(); 第30行是空的

3 个答案:

答案 0 :(得分:3)

您永远不会将myStack变量初始化为有效对象。你可以这样做,

myStack = new ....; 

但更重要的是,与您的代码的具体问题相比,您将需要学习如何完成调试NPE的过程(NullPointerException)。

  • 找到抛出NPE的行。
  • stackTrace将告诉您确切的行,例如在您的情况下,它是PostfixCalculator.java:103 ==您的PostfixCalculator.java类的第103行。
  • 如果您使用IDE(例如NetBeans或Eclipse或IntelliJ),IDE通常可以通过双击堆栈跟踪快速轻松地将您带到违规行。
  • 检查该行的所有变量。
  • 您尝试取消引用的其中一个变量(通常通过调用方法)为null。找出哪一个。
  • 追溯到您的程序,看看它为何为空。

答案 1 :(得分:1)

您尚未初始化堆栈,初始化如下:

Stack<String> myStack= new Stack<>();

答案 2 :(得分:1)

我没有看到您初始化myStack,因此它只能是null