唯一可靠的方式是查看方法声明中的 throws 子句;只有显式声明继承自 Exception 且非 RuntimeException 的异常才属受检异常,编译器强制处理,与方法体、文档、继承实现无关。

看方法声明里的 throws 子句,是唯一可靠的方式。
检查方法签名中的 throws 关键字
Java 中,只有在方法签名显式声明了 throws 后接受检异常(即继承自 Exception 但不是 RuntimeException 的子类),才表示该方法可能抛出受检异常。
- 例如:void readFile() throws IOException → IOException 是受检异常,必须处理
- 而:void logError() throws RuntimeException 或 void logError() throws IllegalArgumentException → 这些是运行时异常,不属受检异常,throws 在此处仅作语义提示,编译器不强制捕获
- 若方法签名中没有 throws,或只抛出 Error 及其子类(如 OutOfMemoryError),则不抛出受检异常
注意继承关系和常见受检异常类型
受检异常必须直接或间接继承 Exception,且不能是 RuntimeException 的子类。典型受检异常包括:
- IOException 及其子类(FileNotFoundException、EOFException 等)
- SQLException
- ClassNotFoundException
- InterruptedException
- 自定义异常:若 class MyException extends Exception(未继承 RuntimeException),也属受检异常
不要依赖方法体或文档推测
即使方法内部有 throw new IOException(),只要签名没写 throws IOException,编译就不通过;反之,即使方法体为空,只要签名声明了 throws SQLException,调用方就必须处理。Javadoc 或实现细节不能替代签名判断。
接口和重写方法需特别留意
子类重写方法时,不能抛出比父类方法更多或更宽泛的受检异常。因此:
- 看父类/接口方法签名中的 throws,就可知实现类最多能抛哪些受检异常
- 如果接口方法声明 void save() throws SQLException,那么任何实现类都不可能在不修改接口的前提下抛出 IOException
- 若实现类方法签名没写 throws,说明它要么不抛受检异常,要么已将异常转为运行时异常(如包装成 RuntimeException)

















