-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)
任何想法,我在做什麼錯了?
謝謝, 卡爾
堅持...我正在計數...... 1,2,3,4,... –
您需要告訴我們哪一行是58行才能給我們提供線索。 – mwhs
順便說一句:有趣的任務/任務。這通常是您可以轉儲堆棧的內容以瞭解發生了什麼的點。 – mwhs