运行时异常继承自runtimeexception,受检异常直接继承exception但不经过runtimeexception;编译器对受检异常强制处理,对运行时异常不检查;典型运行时异常如nullpointerexception,受检异常如ioexception。

直接看继承关系:如果一个异常类最终继承自 RuntimeException,就是运行时异常;如果它继承自 Exception 但没经过 RuntimeException,就是受检异常。
看父类是不是 RuntimeException
这是最可靠、最快速的判断方式:
- NullPointerException → 继承链是 NullPointerException → RuntimeException → Exception → 所以是运行时异常
- IOException → 继承链是 IOException → Exception(没经过 RuntimeException)→ 所以是受检异常
- SQLException、FileNotFoundException、ClassNotFoundException 同理,都是直接继承 Exception,属于受检异常
看编译器会不会报错
写一段调用可能抛异常的方法,观察编译行为:
- 调用
FileInputStream fis = new FileInputStream("a.txt");→ 编译失败,提示“Unhandled exception type FileNotFoundException” → 这是受检异常 - 调用
list.get(100);(list 只有 5 个元素)→ 编译完全通过,运行才抛 IndexOutOfBoundsException → 这是运行时异常
看方法声明要不要加 throws
自己写方法时,异常类型决定是否必须声明:
- 如果方法里
throw new IOException();→ 必须在方法签名后写throws IOException,否则编译不通过 - 如果方法里
throw new IllegalArgumentException();→ 不写 throws 也能编译通过,调用方也不强制 try-catch - 即使你主动写了
throws RuntimeException,编译器也当没看见——它不参与检查
常见例子对照速查
记不住继承链?记住这几组典型代表:
- 运行时异常(不用处理,改代码优先):NullPointerException、ArrayIndexOutOfBoundsException、ArithmeticException、IllegalArgumentException、ClassCastException
- 受检异常(必须处理,否则编译失败):IOException、SQLException、FileNotFoundException、InterruptedException、ParseException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











