15

我有一个父类的检查异常的方法,它可以抛出父类和子类类型的异常

public void method() throws ParentException {
    if( false ) throw new ParentException();
    else if( true ) throw new ChildException(); // this one is thrown
}

我有一个级联 catch 块,它首先有子异常

try {
    method();
} catch (ChildException e) {
    // I get here?
} catch (ParentException e) {
    // or here?

}

哪个块会捕获抛出的异常?由于该方法仅显式声明了 ParentException,因此 ChildException 是否会显示为 ParentException 的实例?

4

1 回答 1

19

catch块将始终捕获对其可用的最具体的异常,从继承层次结构向上工作。

我要强调的是,你的 catch 块必须在继承层次结构中;也就是说,你不能声明一个后跟的catch块,因为那是编译错误。你在那里拥有的东西(就块而言)是有效的。ParentExceptionChildExceptioncatch

一个更常见的用例是处理文件 IO 时;FileNotFoundException然后,您可以先捕获IOException错误是否比FileNotFoundException.

于 2016-07-18T16:52:07.573 回答