Java括号匹配代码抛出Empty Stack Exception空栈异常如何解决
异常原因
触发java.util.EmptyStackException的核心原因是逻辑运算符优先级错误:
Java中&&的优先级高于||,你编写的判断条件中,!stack.empty() &&仅和第一个括号匹配条件((char) stack.peek() == '(' && (bracket == ')'))绑定,后面两个||连接的匹配条件没有被栈非空判断覆盖。当栈为空时遇到右括号,后续两个条件仍然会执行stack.peek()操作,直接触发空栈异常。
除此之外你的代码还存在3个潜在问题:
- 没有处理空字符串输入场景,直接访问
arr[0]会抛出数组越界异常 - 循环中
isBalanced被设为false后没有中断循环,仍会执行无意义的遍历逻辑 - 最终返回的变量名拼写错误,你定义的变量是
isBalanced,返回时写的是小写的isbalanced,会触发编译错误
代码修改方案
修改后的可运行代码如下:
import java.util.Stack; class Solution{ static boolean ispar(String x){ // 先处理空字符串边界情况 if(x == null || x.isEmpty()){ return true; } char [] arr = x.toCharArray(); int length = arr.length; Stack<Character> stack = new Stack<>(); boolean isBalanced = true; for(int i=0; i<length; i++){ char bracket = arr[i]; if(bracket == '{' || bracket =='(' || bracket == '['){ stack.push(bracket); } // 给所有匹配条件套一层括号,确保先判断栈非空再执行peek else if(!stack.empty() && ( ((char) stack.peek() == '(' && (bracket == ')')) || ((char) stack.peek() == '{' && bracket == '}') || ((char) stack.peek() == '[' && bracket == ']') ) ){ stack.pop(); } else{ isBalanced = false; // 已经不匹配直接跳出循环,无需继续遍历 break; } } // 最终同时判断标识和栈是否为空 return isBalanced && stack.empty(); } }
主要修改点:
- 新增空字符串输入的边界校验
- 给所有括号匹配的判断条件外层套了括号,确保
!stack.empty()对所有匹配逻辑生效,不会出现空栈调用peek的情况 - 匹配失败后直接break跳出循环减少无效运算
- 简化最终的返回逻辑,同时校验平衡标识和栈空状态,修正了变量名拼写错误
- 移除了开头单独判断第一个字符是否为右括号的冗余逻辑,现有循环已经可以覆盖该场景
内容的提问来源于stack exchange,提问作者Tushar Chouhan
相关产品推荐
相关产品推荐

