2017-10-11 333 views
-2

如何处理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; 
} 
+1

“说我的堆栈没有时是空的。”所以你把Java运行时称为骗子?当然,它与'push()'和'pop()'有关。那些是操纵堆栈的唯一东西。要么你输入错误,要么你有逻辑错误。显示更多的努力。 – Kayaman

+0

很简单。你从一个空的堆栈开始,然后程序跳过while循环,因为输入中没有任何标记,然后你尝试弹出堆栈,但没有任何东西。如果输入中确实存在令牌,**为什么要将它们隐藏起来?** – ajb

+2

此外,异常发生在哪里?您没有显示堆栈跟踪,这是在发生异常时显示的最重要的事情。 – Kayaman

回答

0

的异常引起的应检查stack.length由于以下几行代码。

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

在循环期间的,如果“EXPR”的第一个字符是操作员在第一次迭代则条件内,如果为真

if (isOperator(c)) //true 

但由于它是在第一次迭代,堆栈没有任何操作数来弹出。

上面的代码工作正常“EXPR”具有足够的操作数1 2 +运营商之前,但不用于“EXPR”+ 1 2其不具有足够的( 2)操作员之前的操作数。

-1

我猜,你以前stack.pop()

+1

这不是一个答案,而是一个评论(或者它是一个答案?如果是,它是错误的和不好的)。 – Kayaman