关于Java Checked Exception发生时机的困惑求解及官方文档参考
关于Java受检异常的编译时与运行时说明
核心结论
所有异常(包括受检和非受检)的实际发生(抛出)都在运行时,但受检异常会被Java编译器在编译阶段强制检查处理规则。
Java 8官方文档依据(来自Java语言规范JLS)
受检异常指的是除
RuntimeException及其子类、Error及其子类之外的Throwable子类。编译器会强制要求代码必须对这类异常做出处理:要么通过try-catch块捕获并处理,要么在方法签名中使用throws声明将异常向上抛出。如果未按此规则处理,编译会直接失败。
而异常实例的创建、抛出动作,本质是代码执行的结果,只有在程序运行时才会触发——编译阶段仅做语法和规则检查,不会执行任何业务逻辑,因此不可能产生实际的异常。
举例说明
比如java.io.IOException是典型的受检异常:
- 编译时:如果代码中调用了可能抛出
IOException的方法(如new FileInputStream("file.txt"))却未处理该异常,编译器会直接报错,这就是编译阶段的检查行为。 - 运行时:只有当程序实际执行到该代码,且确实出现文件不存在等IO错误时,才会实际抛出
IOException实例,这是运行时的异常发生行为。
内容的提问来源于stack exchange,提问作者Vattamwar Prathamesh Pravin
相关产品推荐
相关产品推荐

