Java中try-catch用于捕获可处理的运行时异常(如NullPointerException、NumberFormatException等),需避免兜底捕获、空catch及掩盖问题,优先预防+合理处理+资源安全释放。

Java 中 try-catch 主要用于捕获和处理运行时异常(RuntimeException 及其子类),这类异常不需要强制声明,但一旦发生又未被捕获,会导致程序中断。关键在于:**不是所有运行时异常都该被 catch,而是只捕获你能合理处理的那些**。
明确哪些异常属于运行时异常
运行时异常继承自 RuntimeException,常见如:
- NullPointerException:访问 null 对象的成员
- ArrayIndexOutOfBoundsException:数组下标越界
- IllegalArgumentException:方法传入非法参数
- NumberFormatException:字符串转数字格式错误
- ClassCastException:类型强转失败
它们和 IOException、SQLException 等检查型异常(checked exception)不同——编译器不强制你处理,但你可以选择用 try-catch 拦截。
基本 try-catch 写法(捕获单个运行时异常)
语法结构清晰,重点是把可能抛出异常的代码放在 try 块中,对应异常类型写在 catch 后:
立即学习“Java免费学习笔记(深入)”;
String str = "123abc";
int num;
try {
num = Integer.parseInt(str); // 可能抛出 NumberFormatException
} catch (NumberFormatException e) {
System.out.println("输入不是有效整数,使用默认值 0");
num = 0;
}
注意:不要 catch Exception 或 Throwable 来“兜底”所有异常,这会掩盖真正的问题,也违背异常设计初衷。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
多个 catch 块与异常处理策略
一个 try 可以跟多个 catch,按具体到宽泛的顺序排列(否则编译报错):
Object obj = null;
try {
String s = (String) obj; // 可能 ClassCastException
s.charAt(0); // 可能 NullPointerException(但不会执行到这里)
} catch (ClassCastException e) {
System.err.println("类型转换失败:" + e.getMessage());
} catch (NullPointerException e) {
System.err.println("空指针异常:" + e.getMessage());
}
实际开发中更推荐:
- 优先用 if 判断预防(如判空、校验范围),比依赖 catch 更高效、更清晰
- catch 后尽量做有意义的事:记录日志、返回友好提示、降级处理、重试或包装为业务异常再抛出
- 避免空 catch 块(即 catch 里什么也不做),这是严重隐患
配合 finally 或 try-with-resources 确保资源释放
虽然运行时异常不涉及 I/O 等必须关闭的资源,但如果 try 块中打开了流、连接等,仍需确保清理:
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("data.txt"));
String line = reader.readLine(); // 可能抛出 RuntimeException(如 NPE),也可能抛出 checked 异常
// 处理逻辑...
} catch (RuntimeException e) {
System.err.println("运行时问题:" + e.getMessage());
throw e; // 可选择重新抛出
} finally {
if (reader != null) {
try { reader.close(); } catch (IOException ignored) {}
}
}
更现代的方式是用 try-with-resources(适用于实现了 AutoCloseable 的资源),它自动处理 close,且对运行时异常也安全:
try (BufferedReader reader = new BufferedReader(new FileReader("data.txt"))) {
String line = reader.readLine();
// 即使这里抛出 NullPointerException,reader 也会被自动关闭
}
不复杂但容易忽略:捕获运行时异常不是为了“吞掉错误”,而是为了让程序在可控范围内继续运行或给出明确反馈。该预防的预防,该记录的日志,该暴露的别隐藏。

















