2014-02-27 40 views
1

我已经遇到了我的Java PostFix calc程序中的一个障碍,至今我无法修复。特别是,这个程序导致了一个NullPointerException,我不知道为什么。毫不迟疑,在这里。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; 
     } 
    } 

这里是堆栈跟踪:103

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

线是myStack.push(); 第30行为空

+1

可以粘贴错误痕迹 – Kick

+0

我如何在Netbeans上做到这一点? – AmazingVal

+0

发布堆栈跟踪。同时告诉我们空指针是哪一行。堆栈跟踪应位于程序通常所在的控制台中。 –

回答

3

您从不初始化myStack变量为有效的对象。你可以用这样做,

myStack = new ....; 

但不是与你的代码中的具体问题更重要的是,你将要学习如何去通过调试NPE(NullPointerException异常)的过程。

  • 查找引发NPE的行。
  • stackTrace会告诉你究竟是哪一行,例如你的情况是PostfixCalculator.java:103 == PostfixCalculator.java类的第103行。
  • 如果您使用的是IDE,如NetBeans或Eclipse或IntelliJ,那么IDE通常可以通过双击堆栈跟踪,快速方便地将您引导到违规行。
  • 检查该行上的所有变量。
  • 您尝试解除引用的那些变量之一(通常通过调用方法)为空。找出哪一个。
  • 追溯到您的程序,看看它为什么为空。
+0

快速接收。 +1 –

+1

+1,以帮助OP在将来例外 – Kayz

1

您还没有初始化堆栈,初始化如下:

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

我没有看到你初始化myStack,所以它只能是null