2015-12-08 73 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。

相关问题