2014-02-27 67 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