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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:48:01