You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何调换while循环条件顺序会触发EmptyStackError?

为什么调换while循环条件顺序会抛出EmptyStackError?

这问题的核心在于Java中&&运算符的「短路求值」特性——这可是写代码时必须掌握的基础细节!

先看你能正常运行的代码:

while(!s.isEmpty() && prec(c) <= prec(s.peek())) {}

这里&&是短路逻辑与,它会严格从左到右判断条件:

  • 如果栈已经为空,!s.isEmpty()返回false,这时候&&会直接跳过第二个条件的判断(因为逻辑与只要有一个条件为false,整体结果就是false,没必要再计算后面的),所以根本不会执行s.peek(),自然不会触发EmptyStackError。

再看抛出异常的代码:

while(prec(c) <= prec(s.peek()) && !s.isEmpty()) {}

这次&&先执行第一个条件prec(c) <= prec(s.peek()),而prec(s.peek())需要调用s.peek()方法——如果此时栈是空的,s.peek()会直接抛出EmptyStackError,因为栈为空时调用peek()是不合法的,这时候还没轮到判断!s.isEmpty()呢,异常就已经发生了。

简单总结:&&的执行顺序是从左到右,且具备短路特性——左边条件不满足时,右边代码完全不会运行。所以写这类条件时,一定要把「安全检查」(比如判断栈非空、对象非null)放在&&的左边,才能避免触发不必要的异常。

内容的提问来源于stack exchange,提问作者arjundaya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:52:51