Java异常:java.util.NoSuchElementException
这个异常:
java.util.NoSuchElementExceptionat java.util.ArrayDeque.removeFirstat java.util.ArrayDeque.pop
说明调用了 stack.pop()
时,栈已经空了,而 ArrayDeque.pop()
在栈空时会抛出 NoSuchElementException
。
✅ 根本原因
没有在 pop()
前判断栈是否为空,导致比如输入字符串是 ")"
或 "}}"
这种右括号先出现的情况时,程序崩溃。
✅ 正确做法
在 pop()
前加一句判断:
if (stack.isEmpty()) return false;
✅ 修改后的完整代码(已修复所有问题)
import java.util.Deque;
import java.util.ArrayDeque;class Solution {public boolean isValid(String s) {Deque<Character> stack = new ArrayDeque<>();for (char c : s.toCharArray()) {if (c == '(' || c == '{' || c == '[') {stack.push(c);} else {if (stack.isEmpty()) return false;char top = stack.pop();if (!isMatching(top, c)) return false;}}return stack.isEmpty();}private boolean isMatching(char open, char close) {return (open == '(' && close == ')') ||(open == '{' && close == '}') ||(open == '[' && close == ']');}
}
✅ 总结
异常原因 | 解决方法 |
---|---|
空栈调用 pop() | 在 pop() 前判断 stack.isEmpty() |
保证健壮性 | 所有右括号出现前都要确保栈不为空 |
现在这段代码可以处理所有合法和非法输入,不会抛出异常。