Java 为什么这个程序不能正常运行?
任务是使用堆栈创建后缀到中缀的转换器。该程序编译正确,但当我试图制作一个演示类时,我收到一个空点异常第32行。请分享任何观察结果、更好的编码约定或解决方案Java 为什么这个程序不能正常运行?,java,stack,Java,Stack,任务是使用堆栈创建后缀到中缀的转换器。该程序编译正确,但当我试图制作一个演示类时,我收到一个空点异常第32行。请分享任何观察结果、更好的编码约定或解决方案 import java.util.Stack; public class PostfixtoInfix { private String expression; private Stack<Character> s; Character pOpen = new Character('('); Ch
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;
}
}
您的访问修饰符可能阻止程序访问堆栈。 更改: 致:
阅读更多内容似乎您声明了一个私有成员s,从未向其分配任何内容,然后尝试在s.empty和s.pop之类的表达式中使用它。如果没有为s分配任何内容,则它为null,并且尝试对其调用方法将导致NullPointerException 要创建空堆栈,可能需要将声明更改为:
private Stack <Character> s = new Stack<Character>();
要修复NPE,请初始化对象。与C++不同,堆栈S;等价于堆栈s=null;;不堆叠s=新堆叠
小心==和!=与装箱对象的预期行为不同
给出正确的答案!回答错误
它们是不同的对象。如果要比较是否相等,请使用以下任一选项:
System.out.println(a.equals(aa));
System.out.println((char)a==(char)aa);
第一种方法使用显式方法比较对象内容。第二种方法通过使用非对象原语来避免此问题,其中相等是按位的,而不是引用相等。首先,您有一个看起来像构造函数的方法:
public String PostfixtoInfix(String e) {
尝试将其更改为其他内容,例如:
public String transform(String e) {
其次,您的s字段从未被分配堆栈。放
s = new Stack<Character>();
在构造函数中。还有,新角色“a”!=新角色“a”,因为这将绕过自动枕重缓存装箱。只使用简单的字符,如pOpen和pClose。不知道任何会导致NullPointerException的方法。应该会导致编译器错误。建议?学习使用你的调试器和谷歌。我投票决定关闭,因为寻求调试帮助的问题为什么这段代码不起作用?必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。
public String PostfixtoInfix(String e) {
public String transform(String e) {
s = new Stack<Character>();