不建议捕获 exception 是因为它会掩盖程序中未预期的错误,导致难以排查的 bug。直接捕获该基类会同时吞掉 runtimeexception(如空指针)和受检异常,使程序在出错后继续以错误状态运行。最佳做法是精确捕获具体的异常类型,或者在无法处理时将其包装为自定义异常向上抛出。

捕获 Exception 会隐藏哪些运行时错误
当代码块中抛出 NullPointerException 或 IllegalArgumentException 时,如果外层使用了 catch (Exception e),这些典型的编程错误会被静默忽略。程序不会崩溃,而是继续执行后续逻辑,这会导致数据不一致且极难定位问题根源。

public void process() {
try {
String str = null;
System.out.println(str.length());
} catch (Exception e) {
// 这里吞掉了 NullPointerException
System.out.println("Error caught");
}
System.out.println("Program continues");
}
上述代码输出 "Error caught" 和 "Program continues",而不是抛出异常终止。这种静默失败是生产环境中最危险的隐患之一。
如何正确区分并处理不同类型的异常
正确的做法是使用多个 catch 块分别处理已知且可恢复的异常,而让未处理的运行时异常自然传播。对于受检异常,应明确指定具体类型,如 IOException 或 SQLException。这样既能保证业务逻辑的健壮性,又能确保严重错误被及时发现。

public void readFile(String path) {
try {
Files.readAllLines(Paths.get(path));
} catch (NoSuchFileException e) {
System.out.println("File not found, using default");
} catch (IOException e) {
throw new RuntimeException("IO error", e);
}
}
通过分离处理逻辑,程序在文件不存在时使用默认值,而在其他 IO 错误时抛出运行时异常,确保了错误的可见性和可追溯性。
基于程序中某个输入、条件或结果的具体问题
在上面的 readFile 示例中,如果传入的路径对应的文件确实存在但权限不足,程序会进入第二个 catch 块并抛出 RuntimeException。这是因为 AccessDeniedException 是 IOException 的子类,但不匹配第一个更具体的 NoSuchFileException。开发者必须注意 catch 块的顺序,将更具体的异常放在前面,否则编译器会报错或逻辑失效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











