2015-12-08 97 views
-3

這個任務是爲了使用Stack創建一個後綴到infix轉換器。該程序編譯正確,但是當我嘗試創建一個演示類時,我收到了一個空值異常行32.請分享任何觀察結果,更好的編碼約定或解決方案。爲什麼這個程序不能正常運行?

import java.util.Stack; 

public class PostfixtoInfix { 
    private String expression; 
    private Stack<Character> s; 
    Character pOpen = new Character('('); 
    Character pClose = new Character(')'); 

    public String PostfixtoInfix(String e) { 
     expression = e; 
     String output = ""; 
     for (int i = 0; i < e.length(); i++) { 
      char currentChar = e.charAt(i); 
      if (isOperator(currentChar)) { 
       while (!s.empty() && s.peek() != pOpen 
         && hasHigherPrecedence(s.peek(), currentChar)) { 
        output += s.peek(); 
        s.pop(); 
       } 
       s.push(currentChar); 
      } else if (isOperand(currentChar)) { 
       output += currentChar; 
      } else if (currentChar == '(') { 
       s.push(currentChar); 
      } else if (currentChar == ')') { 
       while (!s.empty() && s.peek() != pClose) { 
        output += s.peek(); 
        s.pop(); 
       } 
      } 
      while (!s.empty()) { 
       output += s.peek(); 
       s.pop(); 
      } 
     } 
     return output; 
    } 

    public boolean isOperator(char c) { 
     if (c == '+' || c == '-' || c == '/' || c == '*' || c == '^') 
      return true; 
     return false; 
    } 

    public boolean isOperand(char c) { 
     if (c >= '0' && c <= '9') 
      return true; 
     if (c >= 'a' && c <= 'z') 
      return true; 
     if (c >= 'A' && c <= 'Z') 
      return true; 
     return false; 
    } 

    public int getOperatorWeight(char operator) { 
     int weight = -1; 
     switch (operator) { 
     case '+': 
     case '-': 
      weight = 1; 
      break; 

     case '*': 
     case '/': 
      weight = 2; 
      break; 

     case '^': 
      weight = 3; 
     } 
     return weight; 
    } 

    public boolean hasHigherPrecedence(char operator1, char operator2) { 
     int op1 = getOperatorWeight(operator1); 
     int op2 = getOperatorWeight(operator2); 
     if (op1 == op2) { 
      if (isRightAssociative(operator1)) 
       return false; 
      else 
       return true; 
     } 
     return op1 > op2 ? true : false; 
    } 

    public boolean isRightAssociative(char op) { 
     if (op == '^') 
      return true; 
     return false; 
    } 
} 
+1

哪一行是32行? – keshlam

+0

建議?學習使用你的調試器和谷歌。 – csmckelvey

+0

我投票結束,因爲「尋求調試的問題有幫助(」爲什麼不是這個代碼工作?「)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。明確的問題陳述對其他讀者無益。「 – bhspencer

回答

-2

您的訪問修飾符可能會阻止程序訪問堆棧。 變化:

private Stack <Character> s; 

到:

protected Stack <Character> s; 

更多here

+3

不知道會導致NullPointerException的任何方式。如果有的話應該會導致編譯器錯誤。 –

0

看來,你聲明一個私有成員s,從未指定任何東西給它,然後嘗試在表達式中使用它如s.empty()s.pop()。如果沒有分配給s,那麼它是null,並試圖調用其上的方法將導致NullPointerException。

要創建一個空的堆棧,你可能想聲明更改爲:

private Stack <Character> s = new Stack<Character>(); 
2

要解決的NPE 初始化對象。與C++不同,Stack<Character> s;相當於Stack<Character> s = null;; 不是Stack<Character> s = new Stack<>();

謹防==!=表現爲你所期望的盒裝對象。 (正確!)答案false

他們是不同的對象。如果你想比較平等,使用:

System.out.println(a.equals(aa)); 
System.out.println((char)a==(char)aa); 

第一個採用了比較對象內容一個明確的方法。第二個通過使用非對象基元來避免這個問題,其中相等是按位而不是引用相等。

0

首先,你有一個方法,看起來像一個構造函數:

public String PostfixtoInfix(String e) { 

嘗試將其更改爲別的東西,如:

public String transform(String e) { 

其次,你的s場從未被分配一個堆棧。把

s = new Stack<Character>(); 

在你的構造函數。此外,new Character('a') != new Character('a'),因爲這將繞過自動(枕​​重量緩存)拳擊。請使用簡單的char s作爲pOpen和pClose。

相關問題