非空堆栈的 EmptyStackException

Posted

技术标签:

【中文标题】非空堆栈的 EmptyStackException【英文标题】:EmptyStackException for non empty stack 【发布时间】:2018-03-22 17:11:06 【问题描述】:

我如何处理这段代码的EmptyStackException?读取文件的某些部分后显示我的堆栈为空。我猜它与push()pop() 方法有关,但不确定。

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;

【问题讨论】:

“说我的堆栈是空的,其实它不是。”所以你说 Java 运行时是骗子?当然,它与push()pop() 有关。这些是唯一操纵堆栈的东西。要么您输入错误,要么您有逻辑错误。表现出更多的努力。 很简单。您从一个空堆栈开始,然后程序跳过 while 循环,因为输入中没有任何标记,然后您尝试弹出堆栈但那里什么都没有。如果输入中确实有标记,你为什么要对我们隐藏它们??? 另外,异常发生在哪里?您没有显示堆栈跟踪,这是当您遇到异常时要显示的最重要的内容。 【参考方案1】:

异常是由于以下代码行引起的。

op2 = ((Integer) stack.pop()).intValue();
op1 = ((Integer) stack.pop()).intValue();

在循环的第一次迭代中,如果 'expr' 的第一个字符是运算符,则 if 内部的条件为真

if (isOperator(c)) //true

但由于是第一次迭代,堆栈中没有任何要弹出的操作数。

上面的代码适用于 'expr' 例如 1 2 + 在运算符之前有足够的操作数,但不适用于 'expr' 例如 + 1 2 在运算符之前没有足够的 (2) 个操作数。

【讨论】:

【参考方案2】:

我想,你应该在stack.pop()之前检查stack.length

【讨论】:

这不是一个答案,而是一个评论(或者它是一个答案?如果是,那就错了)。

以上是关于非空堆栈的 EmptyStackException的主要内容,如果未能解决你的问题,请参考以下文章

EmptyStackException - 二维数组上的 Java 深度优先搜索算法

我可以强制CloudFormation删除非空的S3 Bucket吗?

简述边界表示的四连通区域的种子填充算法的基本思想和执行步骤

LinkedStack的底层实现

数组实现栈

栈--数组实现