Java Lisp 表达式计算器中的空指针异常



我编写了这个程序来计算 Java 中的 Lisp 表达式,但它在运行时给了我空指针异常,这是我的代码:

import java.util.Queue;
import java.util.LinkedList;
import java.util.Stack;
import java.util.ArrayList;

class IterativeEvaluator2
{ 
    private ExpressionScanner expression;
     public IterativeEvaluator2 (String expression)
    {
        this.expression = new ExpressionScanner(expression);
    }
    public double evaluate(Queue<Double> operandqueue)
    {
            // write your code here to create an explicit context stack
        Stack<Queue> temp_stack = new Stack<Queue>();
        char operator = ' ';
            double operand = 0.0;
            // write your code here to evaluate the LISP expression iteratively
            // you will need to use an explicit stack to push and pop context objects
        while ( expression.hasNextOperator() || expression.hasNextOperand() )
        {
            // Get the open bracket         
            if ( expression.hasNextOperator())    
                {
                operator = expression.nextOperator() ;
                if (operator == '(')
                { 
                    // if the stack is empty then the first bracket is trivial
                    // so this method will be instantiated by null
                    if (temp_stack.empty())
                        temp_stack.push(operandqueue);      
                    // else instantiate an arraylist(Queue)
                    else {
                        operandqueue = new LinkedList<Double>();
                        }
                }
                // push the list into the stack after the closing bracket appears       
                else if (operator == ')')
                {   
                    operand = calculate(operandqueue);
                    operandqueue = temp_stack.pop();
                    if (operandqueue != null)
                        operandqueue.offer(operand);
                }
            // if it is another operator then it must be +,-,/,*
                else {
                    operator = expression.nextOperator();
                    operandqueue.offer( (double) operator ); \ this is where it says there is an error
                }
            }
            // else it is an operand so just put it in the queue
            else
                operandqueue.offer( (double) expression.nextOperand() ); 
        }
    return operand;
    }
        private double calculate(Queue<Double> some_queue)
        {
                char operator = (char) (some_queue.remove()).intValue();
                double operand1 = 0;
                double operand2;            
                switch(operator){
                    case '+' :  while( !some_queue.isEmpty() )
                            {
                                operand2 = some_queue.remove();  
                                operand1 = operand1 + operand2;         
                            }
                            break;
                    case '-' :  operand1 = some_queue.remove();
                            //checks for negative numbers
                            if (some_queue.isEmpty() )
                                operand1 = 0  -  operand1;
                            else{
                                while ( !some_queue.isEmpty() )
                                {
                                    operand2 = some_queue.remove();
                                    operand1 =  operand1 - operand2;
                                }
                            }
                            break;
                    case '*' :  operand1 = 1;
                            while ( !some_queue.isEmpty() )
                            {
                                operand2 = some_queue.remove();
                                operand1 = operand1*operand2;
                            }
                            break;
                    case '/' :  operand1 = some_queue.remove();
                            if (some_queue.isEmpty() )
                                                    operand1 = 1/operand1 ;
                                                else{
                                                        while (!some_queue.isEmpty())
                                {
                                        operand2 = some_queue.remove();
                                    operand1 = operand1/operand2;                                                                                           }
                            }
                            break;
                }
            return operand1;
        }
    public static void main(String [] args)
    {
        String s =  
        "(+t(- 6)nt(/t(+ 3)ntt(- t(+ 1 1)nttt3nttt1)ntt(*))nt(* 2 3 4))";  // = 16.5
        IterativeEvaluator2 myEvaluator = new IterativeEvaluator2(s);
        System.out.println("Evaluating LISP Expression:n" + s);
        System.out.println("Value is: " + myEvaluator.evaluate(null)); 
    }
}  /* 201340 */

当我编译并运行程序时,这就是我得到的:

Evaluating LISP Expression:
(+  (- 6)
    (/  (+ 3)
        (-  (+ 1 1)
            3
            1)
        (*))
    (* 2 3 4))
Exception in thread "main" java.lang.NullPointerException
    at IterativeEvaluator2.evaluate(IterativeEvaluator2.java:58)
    at IterativeEvaluator2.main(IterativeEvaluator2.java:122)

关于我做错了什么的任何想法?

谢谢卡尔

myEvaluator.evaluate(null)

所以 NPE 在第 58 行,因为执行operandqueue.offer()operandqueue null

最新更新