捕获异常的子类

时间:2017-12-03 12:36:29

标签: java exception exception-handling

我在Java 8中测试了一些关于异常处理的事情。当使用try-catch块时,catch子句应该包含仅引发的 异常在try区块。

正确使用:

try {
    throw new IOException();
} catch (IOException e){
    // do something - this code will be activated
} catch (Exception e){
    // do something - this code will not be activated
}

IOException catch子句匹配try块中抛出的异常,并将执行其代码。如果省略IOException catch子句,则Exception catch子句将激活,因为IOException扩展Exception。这是非常基本的东西。我不知道的是为什么以下代码也会编译:

try {
    throw new Exception();
} catch (IOException e){
    // do something - this code will not be activated
} catch (Exception e){
    // do something - this code will be activated
}

在这种情况下,抛出最通用的基类异常。抛出的异常与IOException不匹配,因此将由Exception catch子句处理。但是我曾期望编译器警告我IOException catch子句无效,因为我既没有将它放在try块中,也没有调用抛出IOException的方法。

如果我将抛出的异常更改为IOException不会继承的内容:

try {
    throw new IllegalArgumentException();
} catch (IOException e){  // compiler complains about this line
} catch (Exception e){
}

然后编译器正确告诉我IOException永远不会在try块中抛出,因此无效。这是否与Exception基类有关,该基类有可能包含IOException实例并且与之匹配?按照这种推理方式,这是否意味着:

try {
    Exception exception = new IOException();
    throw exception;
}

将被IOException catch子句捕获?

0 个答案:

没有答案