我在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子句捕获?