为何调换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
相关产品推荐
相关产品推荐

