即使try块实际上没有抛出任何异常,下面的代码也可以编译好。
public static void main(String[] args) {
try {}
catch (Exception e) {} // compiles ok
}
但是如果使用Exception的子类替换catch,则代码将无法编译。
public static void main(String[] args) {
try {}
catch (IOException e) {} // won't compile.
}
编译器错误是:IOException的无法访问的catch块。永远不会从try语句体中抛出此异常。
当Exception& amp; IOException是检查异常吗?我正在使用Java 7。
答案 0 :(得分:6)
编译器可以确切地知道代码的哪个部分可以抛出IOException
,因为它是已检查的异常,因此每个可以抛出此类异常的方法都必须在方法签名。
另一方面,运行时或未经检查的异常并不是预期的,因为RuntimeException
(未经检查的异常的父类)也扩展了类Exception
,然后编译器就可以了。
答案 1 :(得分:3)
Exception
的子类是未经检查的例外(RuntimeException
extends Exception
)。 Throwable
的行为类似。 RuntimeException
或RuntimeException
的子类的行为类似。除了Exception
之外的RuntimeException
的子类不会。
答案 2 :(得分:3)
Manouti的回答似乎是正确的,但根据java文档:
如果catch子句捕获已检查的异常类型E1,但是没有检查的异常类型E2,以便以下所有内容都成立,那么这是一个编译时错误:
E2<:E1对应于catch子句的try块可以抛出E2 没有紧接着的try语句的前一个catch块 捕获E2或E2的超类型。 除非E1是类Exception。
有一个明确的例子是抛出一个Exception
实例(Exception
类是例外的,有人可能会说)。这是Java 5文档,但除非有人另外看到,否则我非常怀疑自
查看Exception
和IOException
https://docs.oracle.com/javase/7/docs/api/java/lang/Exception.html
和
https://docs.oracle.com/javase/7/docs/api/java/io/IOException.html?is-external=true
在Java 7中,我没有看到关于Checked / Unchecked异常的讨论是直接相关的 - 虽然未经检查的异常不遵循相同的规则,但未经检查的异常必须从RuntimeException
继承, Exception
当然不是(它是该类的父母)
https://docs.oracle.com/javase/specs/jls/se5.0/html/classes.html#308526
(再次,Java 5文档,但它没有改变) https://docs.oracle.com/javase/specs/jls/se5.0/html/exceptions.html