EmptyStackException非空堆栈
问题描述:
如何处理EmptyStackException
这段代码?在阅读文件的一部分后,显示我的堆栈是空的。我猜它与push()
和pop()
方法有关,但不完全确定。EmptyStackException非空堆栈
Stack<Integer> stack = new Stack<Integer>();
int op1, op2, result = 0;
String token;
StringTokenizer tokenizer = new StringTokenizer(expr);
while (tokenizer.hasMoreTokens()) {
token = tokenizer.nextToken();
char c = token.charAt(0);
if (isOperator(c)) {
op2 = ((Integer) stack.pop()).intValue();
op1 = ((Integer) stack.pop()).intValue();
result = evalSingleOp(token.charAt(0), op1, op2);
stack.push(new Integer(result));
} else {
stack.push(new Integer(Integer.parseInt(token)));
}
}
result = ((Integer) stack.pop()).intValue();
return result;
}
答
的异常引起的应检查stack.length
由于以下几行代码。
op2 = ((Integer) stack.pop()).intValue();
op1 = ((Integer) stack.pop()).intValue();
在循环期间的,如果“EXPR”的第一个字符是操作员在第一次迭代则条件内,如果为真
if (isOperator(c)) //true
但由于它是在第一次迭代,堆栈没有任何操作数来弹出。
上面的代码工作正常“EXPR”具有足够的操作数如1 2 +运营商之前,但不用于“EXPR”如+ 1 2其不具有足够的( 2)操作员之前的操作数。
“说我的堆栈没有时是空的。”所以你把Java运行时称为骗子?当然,它与'push()'和'pop()'有关。那些是操纵堆栈的唯一东西。要么你输入错误,要么你有逻辑错误。显示更多的努力。 – Kayaman
很简单。你从一个空的堆栈开始,然后程序跳过while循环,因为输入中没有任何标记,然后你尝试弹出堆栈,但没有任何东西。如果输入中确实存在令牌,**为什么要将它们隐藏起来?** – ajb
此外,异常发生在哪里?您没有显示堆栈跟踪,这是在发生异常时显示的最重要的事情。 – Kayaman