Java异常try-catch异常与IOException

时间:2014-11-10 21:16:12

标签: java exception

即使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。

3 个答案:

答案 0 :(得分:6)

编译器可以确切地知道代码的哪个部分可以抛出IOException,因为它是已检查的异常,因此每个可以抛出此类异常的方法都必须在方法签名。

另一方面,运行时或未经检查的异常并不是预期的,因为RuntimeException(未经检查的异常的父类)也扩展了类Exception ,然后编译器就可以了。

答案 1 :(得分:3)

Exception的子类是未经检查的例外(RuntimeException extends Exception)。 Throwable的行为类似。 RuntimeExceptionRuntimeException的子类的行为类似。除了Exception之外的RuntimeException的子类不会。

答案 2 :(得分:3)

Manouti的回答似乎是正确的,但根据java文档:

  

如果catch子句捕获已检查的异常类型E1,但是没有检查的异常类型E2,以便以下所有内容都成立,那么这是一个编译时错误:

     

E2<:E1对应于catch子句的try块可以抛出E2   没有紧接着的try语句的前一个catch块   捕获E2或E2的超类型。 除非E1是类Exception。

有一个明确的例子是抛出一个Exception实例(Exception类是例外的,有人可能会说)。这是Java 5文档,但除非有人另外看到,否则我非常怀疑自

以来这已经发生了变化

查看ExceptionIOException

的继承树

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