首页 文章

Java异常try-catch异常与IOException [重复]

提问于
浏览
5

这个问题在这里已有答案:

即使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和IOException都被检查异常时,为什么会出现这种情况?我正在使用Java 7 .

3 回答

  • 6

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

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

  • 3

    Exception 具有未经检查的异常的子类( RuntimeException extends Exception ) . Throwable 的行为类似 . RuntimeExceptionRuntimeException 的子类的行为类似 . 除 RuntimeException 之外的 Exception 的子类不会 .

  • 3

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

    如果catch子句捕获已检查的异常类型E1,但是没有检查的异常类型E2,则所有以下保持:E2 <:E1对应于catch子句的try块可以抛出E2 No before,这是编译时错误即时封闭的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中,我认为未经检查的异常不遵循相同的规则,未经检查的异常必须从 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

相关问题