未检查异常指继承自runtimeexception的异常,如nullpointerexception、illegalargumentexception等,编译器不强制处理;应按需捕获可预期、可恢复的场景,避免盲目兜底或空catch,并可通过@controlleradvice、uncaughtexceptionhandler等机制全局处理。

未检查异常(Unchecked Exception)不需要强制捕获,但可以捕获——关键不是“能不能”,而是“该不该”以及“怎么捕获才合理”。
哪些异常属于未检查异常
所有继承自 RuntimeException 的异常都属于未检查异常,编译器不强制你处理。常见例子包括:
- NullPointerException:访问 null 引用的成员
- IllegalArgumentException:方法接收到非法参数
- NumberFormatException:字符串转数字格式错误
- ArrayIndexOutOfBoundsException:数组下标越界
- ClassCastException:类型强转失败
基础捕获方式:try-catch 直接写
语法上和捕获检查型异常完全一样,只是编译器不会报错提醒你必须加:
- 可以按具体类型捕获,例如
catch (NumberFormatException e) - 也可以用父类兜底,例如
catch (RuntimeException e)或catch (Exception e)(但不推荐后者一锅端) - 多个 catch 块需按子类到父类顺序排列,否则编译失败
更合理的捕获策略
盲目捕获所有运行时异常容易掩盖问题。应聚焦在可预期、可恢复、或需友好反馈的场景:
- 用户输入解析(如表单提交的数字字段)→ 捕获 NumberFormatException 并提示“请输入有效数字”
- 外部数据解析(JSON/XML/CSV)→ 捕获 IllegalArgumentException 或自定义运行时异常,包装为业务错误返回
- 调用第三方 SDK 时不确定其内部行为 → 用 RuntimeException 兜底,记录日志并降级处理
- 避免空 catch 块;至少记录
logger.error("解析失败", e),保留完整堆栈
全局捕获未检查异常的手段
当不想在每个方法里重复 try-catch,尤其在 Web 或多线程环境,可用以下机制统一拦截:
- Spring Boot 中用 @ControllerAdvice:对 Controller 层抛出的所有异常(含运行时异常)做集中响应封装
- Thread.setDefaultUncaughtExceptionHandler:为非主线程设置默认处理器,捕获 run() 中漏掉的运行时异常
-
主线程要单独设:它不继承默认处理器,需在 main 方法开头调用
Thread.currentThread().setUncaughtExceptionHandler(...) - 线程池中异常需特殊处理:通过自定义 ThreadFactory 设置 handler,或重写 ThreadPoolExecutor.afterExecute()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











