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); } } }
关键修改点说明
- 修正
matching方法的调用方式:现在传入的是当前遍历到的右括号c,拿到对应的左括号后和栈顶比较,匹配成功就弹出栈顶。 - 增加空栈检查:当遇到右括号时,如果栈为空,说明没有对应的左括号,直接返回false。
- 移除错误的return逻辑:遇到匹配的右括号时仅弹出栈顶,继续循环处理后续字符;遇到非括号字符直接跳过。
- 修正最终返回值:返回
stack.isEmpty(),确保所有左括号都被正确匹配。
现在运行代码,所有测试用例都会符合预期,也不会再抛出IllegalArgumentException了。
内容的提问来源于stack exchange,提问作者Netizen110
相关产品推荐
相关产品推荐

