非受检异常继承自runtimeexception,编译器不强制处理,但可被try-catch捕获;常见例子包括nullpointerexception、arrayindexoutofboundsexception、classcastexception、illegalargumentexception和arithmeticexception等。

非受检异常(Unchecked Exception)在 Java 中继承自 RuntimeException,编译器不强制要求捕获或声明,但你**完全可以像捕获其他异常一样用 try-catch 捕获它们**——只是通常不推荐盲目捕获,而应优先修复根本原因。
哪些是非受检异常?
常见例子包括:
- NullPointerException:访问 null 对象的成员
- ArrayIndexOutOfBoundsException:数组下标越界
- ClassCastException:非法类型转换
- IllegalArgumentException:方法传入非法参数
- ArithmeticException(如除零)
可以捕获,但要判断是否合理
语法上完全支持捕获:
try {
String s = null;
System.out.println(s.length()); // 抛出 NullPointerException
} catch (NullPointerException e) {
System.err.println("空指针异常已处理");
}
但更合理的做法是预防而非兜底:
- 用 Objects.requireNonNull() 主动校验入参
- 用 Optional 避免 null 值误用
- 访问数组前检查长度,调用方法前判空
适合捕获的典型场景
不是所有运行时异常都该被吞掉,以下情况可考虑捕获:
- 第三方库抛出的 RuntimeException,且你无法修改其源码(如某些 JSON 解析库的 JSONException 是运行时异常)
- 业务逻辑中明确知道某段代码可能因外部输入触发异常,且有清晰的降级策略(如解析用户输入的数字字符串失败时返回默认值)
- 统一异常拦截层(如 Spring 的 @ControllerAdvice)对特定 RuntimeException 做日志记录或友好提示
不建议的做法
避免这些常见误区:
- 写成
catch (RuntimeException e)吞掉所有运行时异常 —— 掩盖真正 bug - 空 catch 块(
catch (Exception e) {})导致异常静默丢失 - 在底层工具方法里捕获后“吃掉”异常却不记录、不重抛,让调用方无法感知问题
捕获非受检异常本身不难,关键在于理解它反映的是程序逻辑缺陷,优先从设计和校验入手,再辅以有针对性的捕获和处理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











