我正在尝试按如下方式设置while循环:
while(!data.equals("String");
每当我运行此代码时,我都会收到NullPointerException。 这是为什么?
如果我将代码更改为:
while(data.equals("String");
我没有这样的例外,所以数据中必须有数据,对吗?
编辑:根据评论员的要求添加真实代码。
以下代码是尝试将中缀表示法转换为后缀表示法的方法。
public static Queue infixConvert (LinkedListTest infix){
Stack stack = new Stack();
Queue postfix = new Queue();
while(infix.head.data != "EOF"){
if(isNumber(infix.head.data)){
postfix.insert(infix.head.data);
System.out.println("Insert Queue");
System.out.println("Operator");
}
else if (infix.head.data.equals("(") || infix.head.data.equals(")")){
if(("(").equals(infix.head.data)){
stack.push(infix.head.data);
System.out.println("Open paren");
}
else {
infix.delete(")");
while(!"(".equals(stack.head.data)){
stack.delete(")");
postfix.insert(stack.pop());
System.out.println("Insert Queue");
}
stack.delete("(");
System.out.println("Close Paren");
}
}
else{
if(!(highPrec(stack.head.data, infix.head.data))){
stack.push(infix.head.data);
System.out.println("Push onto Lesser Operand");
}
else if(highPrec(stack.head.data, infix.head.data)){
while(stack.head.data != null){
if (stack.head.data != "("){
postfix.insert(stack.pop());
}
else break;
}
stack.push(infix.head.data);
System.out.println("Push onto Greater Operand");
}
if (infix.head.data == "EOL"){
while(stack.head.data != "EOL"){
postfix.insert(stack.pop());
System.out.println("End Line");
}
}
}
System.out.println(infix.head.data);
infix.head = infix.head.next;
System.out.println("loop\n");
}
return postfix;
}
}
编辑:添加了堆栈跟踪
at Calculator.infixConvert(Calculator.java:57)
at Test.main(Test.java:7)
答案 0 :(得分:5)
你可以 "Yoda-style" :
while(!"String".equals(data)) {
//writing code here you must!
}
因为data
的情况为null,所以它不会导致NPE,因为你调用了“String”的equals方法
答案 1 :(得分:1)
我已经解决了这个问题。
还有一些其他无意的行为导致“(”String从堆栈中删除,所以当while循环运行时,它会遍历整个堆栈,直到它达到null,并为我提供了一个NPE。