2013-11-14 133 views
-1

我有這個程序編寫評估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)\n\t(/\t(+ 3)\n\t\t(- \t(+ 1 1)\n\t\t\t3\n\t\t\t1)\n\t\t(*))\n\t(* 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) 

任何想法,我在做什麼錯了?

謝謝, 卡爾

+0

堅持...我正在計數...... 1,2,3,4,... –

+0

您需要告訴我們哪一行是58行才能給我們提供線索。 – mwhs

+0

順便說一句:有趣的任務/任務。這通常是您可以轉儲堆棧的內容以瞭解發生了什麼的點。 – mwhs

回答

1
myEvaluator.evaluate(null) 

所以NPE在管線58因爲operandqueuenull當執行operandqueue.offer()