非受检异常是程序逻辑错误,源于代码疏漏,如空指针、越界、非法参数等;受检异常才对应环境错误,如io、sql异常;error是jvm崩溃,不可恢复。

非受检异常不是环境错误,它本质上属于程序逻辑错误。
非受检异常只对应可预防的内部逻辑缺陷
Java 中的非受检异常(即 RuntimeException 及其子类)全部源于代码自身的设计或实现疏漏,与外部环境无关:
-
空值误用:调用 null 对象的方法 →
NullPointerException -
边界失控:访问数组或集合时下标越界 →
ArrayIndexOutOfBoundsException、IndexOutOfBoundsException -
参数非法:传入明显不合约定的值(如负数作为长度)→
IllegalArgumentException -
类型错配:强制转型失败 →
ClassCastException -
算术违规:除零、大数溢出等 →
ArithmeticException
环境问题属于受检异常范畴
真正的“环境错误”——比如文件被删、网络中断、数据库连接失败——在 Java 中由 受检异常 表达,例如:
-
IOException(读写失败、连接超时) -
SQLException(SQL 执行异常、连接断开) -
FileNotFoundException(目标文件不存在)
这些异常编译器强制你处理,因为它们不可控、不可预测,只能提前应对,不能靠写对代码来完全避免。
Error 不是异常,更不是环境错误
Error(如 OutOfMemoryError、StackOverflowError)是 JVM 层崩溃信号,既不属于逻辑错误,也不属于环境错误。它不归类为“异常处理”的对象,程序通常无法恢复,也不该尝试捕获。
为什么这个区分很重要
混淆逻辑错误和环境错误,容易导致错误的处理策略:
- 把
NullPointerException用try-catch包裹,等于默认接受缺陷存在 - 对
IOException视而不见,编译直接报错,程序根本跑不起来 - 捕获
OutOfMemoryError并试图“恢复”,实际只是掩盖问题,可能引发更严重状态不一致
所以,非受检异常的存在,不是为了让你 catch,而是提醒你:这里该加判空、该校验参数、该改循环条件了。











