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

Java中Illegal Argument Exception异常排查:括号匹配代码报错

问题排查与修复方案

让我们一步步拆解你遇到的问题,先解决最直接的IllegalArgumentException异常,再修复其他逻辑错误:

1. 异常的直接原因:matching方法的调用逻辑完全搞反了

你的matching方法本身的逻辑是接收右括号,返回对应的左括号(比如传入)返回(),但在checkParentheses方法里,你调用它时传入的是栈顶的左括号(比如stack.peek()拿到的是()。这时候switch里没有对应的case分支,直接走到default抛出异常了!

举个实际场景:当处理字符串"()"的第二个字符)时,栈顶是(,你调用matching('('),switch里没有case '('的处理逻辑,直接触发IllegalArgumentException。

2. 其他致命逻辑错误

除了异常,你的代码还有几个核心逻辑问题,导致它根本无法正确完成括号匹配检查:

  • 遇到匹配的右括号直接return true:这会导致只要遇到一对匹配的括号就立刻返回,完全忽略后续字符(比如"(()))"会被错误判定为true)。正确的做法是弹出栈顶元素,继续处理剩余字符。
  • 遇到非括号字符直接return false:你的测试用例里有空格(比如"({} [()] ({}))"),这会导致代码直接返回false,不符合预期。应该跳过这些非括号字符,而不是直接返回。
  • 最后固定return false:正确的结束条件应该是栈为空(所有左括号都找到了对应的右括号),如果栈不为空,说明有未匹配的左括号。

修复后的完整代码

import java.util.ArrayDeque;
import java.util.Deque;
import static java.lang.System.out;

public class Ex3CheckParen {
    public static void main(String[] args) {
        new Ex3CheckParen().program();
    }

    void program() {
        // All should be true
        out.println(checkParentheses("()"));
        out.println(checkParentheses("(()())"));
        out.println(!checkParentheses("(()))")); // Unbalanced
        out.println(!checkParentheses("((())")); // Unbalanced
        out.println(checkParentheses("({})"));
        out.println(!checkParentheses("({)}")); // Bad nesting
        out.println(checkParentheses("({} [()] ({}))"));
        out.println(!checkParentheses("({} [() ({)})")); // Unbalanced and bad nesting
    }

    boolean checkParentheses(String str) {
        Deque<Character> stack = new ArrayDeque<>();
        String opening = "({[";
        String closing = ")]}";

        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if (opening.contains(String.valueOf(c))) {
                // 左括号入栈
                stack.push(c);
            } else if (closing.contains(String.valueOf(c))) {
                // 右括号:先检查栈是否为空(避免空栈peek/pop)
                if (stack.isEmpty()) {
                    return false; // 没有对应的左括号
                }
                // 修正调用逻辑:传入右括号,获取匹配的左括号后和栈顶比较
                if (matching(c) == stack.peek()) {
                    stack.pop(); // 匹配成功,弹出栈顶
                } else {
                    return false; // 括号类型不匹配
                }
            }
            // 非括号字符:直接跳过,不做处理
        }
        // 最后检查栈是否为空:空则所有括号都匹配,否则有未匹配的左括号
        return stack.isEmpty();
    }

    // 方法本身逻辑正确:接收右括号,返回对应的左括号
    char matching(char ch) {
        switch (ch) {
            case ')':
                return '(';
            case ']':
                return '[';
            case '}':
                return '{';
            default:
                throw new IllegalArgumentException("Invalid closing bracket: " + ch);
        }
    }
}

关键修改点说明

  1. 修正matching方法的调用方式:现在传入的是当前遍历到的右括号c,拿到对应的左括号后和栈顶比较,匹配成功就弹出栈顶。
  2. 增加空栈检查:当遇到右括号时,如果栈为空,说明没有对应的左括号,直接返回false。
  3. 移除错误的return逻辑:遇到匹配的右括号时仅弹出栈顶,继续循环处理后续字符;遇到非括号字符直接跳过。
  4. 修正最终返回值:返回stack.isEmpty(),确保所有左括号都被正确匹配。

现在运行代码,所有测试用例都会符合预期,也不会再抛出IllegalArgumentException了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:43:52