我在Java PostFix计算程序中遇到了障碍,到目前为止我无法解决这个问题。特别是,这个程序导致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;
}
}
这是stacktrace:
java.lang.NullPointerException
at PostfixCalculator.calculate(PostfixCalculator.java:103)
at PostfixCalculatorTest.calculate(PostfixCalculatorTest.java:30)
第103行是myStack.push(); 第30行是空的
答案 0 :(得分:3)
您永远不会将myStack变量初始化为有效对象。你可以这样做,
myStack = new ....;
但更重要的是,与您的代码的具体问题相比,您将需要学习如何完成调试NPE的过程(NullPointerException)。
PostfixCalculator.java:103
==您的PostfixCalculator.java类的第103行。答案 1 :(得分:1)
您尚未初始化堆栈,初始化如下:
Stack<String> myStack= new Stack<>();
答案 2 :(得分:1)
我没有看到您初始化myStack
,因此它只能是null
。