尝试在Java中运行PostFixCalculator时出现NullPointerException

尝试在Java中运行PostFixCalculator时出现NullPointerException,java,list,map,compiler-errors,Java,List,Map,Compiler Errors,我已经让我的代码工作到可以编译和运行的程度,但现在我在两个不同的地方得到异常,如下所示: Exception in thread "main" java.lang.NullPointerException at PostFixCalculator.storeOperand(PostFixCalculator.java:97) at CalcTest.main(CalcTest.java:17) …我根本不知道出了什么问题。第一个错误在下面的代码中 myStack.push(operand);

我已经让我的代码工作到可以编译和运行的程度,但现在我在两个不同的地方得到异常,如下所示:

Exception in thread "main" java.lang.NullPointerException
at PostFixCalculator.storeOperand(PostFixCalculator.java:97)
at CalcTest.main(CalcTest.java:17)
…我根本不知道出了什么问题。第一个错误在下面的代码中

myStack.push(operand);
但是我很迷茫,不知该从这里走到哪里

    import java.util.*;
    public class PostFixCalculator {
    private DoubleStack<Double> myStack;
    private ArrayList<Double> evalList;
    //private Map<String, Operator> operatorMap;
    Map<String, Operator> operatorMap = new HashMap<String, Operator>();

    public PostFixCalculator () {
        Map<String, Operator> operatorMap = new HashMap<String, Operator>();  
        operatorMap.put("+", new AddOp());
        operatorMap.put("add", new AddOp());
        operatorMap.put("-", new SubOp());
        operatorMap.put("sub", new SubOp());
        operatorMap.put("/", new DivOp());
        operatorMap.put("div", new DivOp());
        operatorMap.put("*", new MultOp());
        operatorMap.put("mult", new MultOp());
        operatorMap.put("=", new PrintOp());
        operatorMap.put("print", new PrintOp());     
    }      
    public class AddOp implements Operator {
        public AddOp () {
        }
        public int numArgs () {
            return 2;
        }
        public double eval (List<Double> args) {
            double a = args.get(0);
            double b = args.get(1);
            double sum = a + b;
            return sum;
        }
    }
    public class SubOp implements Operator {
        public SubOp () {
        }

        public int numArgs () {
            return 2;
        }
        public double eval (List<Double> args) {
            double a = args.get(0);
            double b = args.get(1);
            double difference = a - b;
            return difference;
        }
    }
    public class DivOp implements Operator {
        public DivOp () {
        }

        public int numArgs () {
            return 2;
        }
        public double eval (List<Double> args) {
            double a = args.get(0);
            double b = args.get(1);
            double quotient = a / b;
            return quotient;
        }
    }
    public class MultOp implements Operator {
        public MultOp () {
        }

        public int numArgs () {
            return 2;
        }
        public double eval (List<Double> args) {
            double a = args.get(0);
            double b = args.get(1);
            double product = a * b;
            return product;
        }
    }
    public class PrintOp implements Operator {
        public PrintOp () {
        }
        public int numArgs () {
            return 1;
        }
        public double eval (List<Double> args) {
            System.out.println(myStack.pop());
            return 1;
        }
    }
    public void storeOperand (double operand) {
        myStack.push(operand);
    }
    public void evalOperator (String operator) {
        Operator o = operatorMap.get(operator);
        ArrayList<Double> evalList = new ArrayList<Double>();
        if (o.numArgs() == 2) {
            double a = myStack.pop();
            double b = myStack.pop();
            evalList.add(a);
            evalList.add(b);
        }
        else {
            double a = myStack.pop();
            evalList.add(a);
        }
        double answer = o.eval(evalList);
        myStack.push(answer);
    }
}
import java.util.*;
公共类后缀计算器{
私有双栈myStack;
私人ArrayList evalList;
//私人地图操作员地图;
Map operatorMap=newhashmap();
公共后缀计算器(){
Map operatorMap=newhashmap();
运算符map.put(“+”,new AddOp());
运算符map.put(“add”,new AddOp());
运算符map.put(“-”,new SubOp());
运算符映射put(“sub”,新SubOp());
运算符map.put(“/”,new DivOp());
运算符映射put(“div”,新的DivOp());
运算符map.put(“*”,new MultOp());
运算符映射put(“mult”,新的MultOp());
运算符map.put(“=”,new PrintOp());
运算符映射put(“print”,新的PrintOp());
}      
公共类AddOp实现运算符{
公共地址(){
}
公共整数numArgs(){
返回2;
}
公共双重评估(列表参数){
双a=args.get(0);
双b=args.get(1);
双和=a+b;
回报金额;
}
}
公共类SubOp实现运算符{
公共SubOp(){
}
公共整数numArgs(){
返回2;
}
公共双重评估(列表参数){
双a=args.get(0);
双b=args.get(1);
双差=a-b;
收益差;
}
}
公共类DivOp实现运算符{
公共分区(){
}
公共整数numArgs(){
返回2;
}
公共双重评估(列表参数){
双a=args.get(0);
双b=args.get(1);
双商=a/b;
返回商;
}
}
公共类MultOp实现运算符{
公共MultOp(){
}
公共整数numArgs(){
返回2;
}
公共双重评估(列表参数){
双a=args.get(0);
双b=args.get(1);
双积=a*b;
退货产品;
}
}
公共类PrintOp实现运算符{
公共PrintOp(){
}
公共整数numArgs(){
返回1;
}
公共双重评估(列表参数){
System.out.println(myStack.pop());
返回1;
}
}
公共操作数(双操作数){
myStack.push(操作数);
}
公共void evalOperator(字符串运算符){
运算符o=运算符映射获取(运算符);
ArrayList evalList=新的ArrayList();
如果(o.numArgs()==2){
双a=myStack.pop();
double b=myStack.pop();
增加(a);
增加(b);
}
否则{
双a=myStack.pop();
增加(a);
}
双重回答=o.eval(evalList);
myStack.push(回答);
}
}

确保您正在导入所有正在使用的内容。在文件顶部,添加:

import java.util.ArrayList;

如果您使用的是Eclipse,则可以按Ctrl-Shift-O来修复导入。

您仍然缺少以下导入:

import java.util.HashMap;
import java.util.List;
import java.util.Map;

然后检查与自定义类型相关的其余错误。

“我有16个错误”哪些错误?谢谢!我为ArrayList和LinkedList添加了导入语句,但仍然存在错误…好的,编辑您原来的问题帖子,并用PostFixCalculator.java文件的完整内容替换您现在的代码。您声明了
myStack
,但从未初始化它。更改
私有双栈myStack
to
private DoubleStack myStack=new DoubleStack()我确实导入了java.util*;。。。让我重新编辑我的问题与我的新代码和新的错误,我得到。。。