子类catch块是否会捕获已检查的父异常?

时间:2016-07-18 16:50:11

标签: java checked-exceptions

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

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的实例?

1 个答案:

答案 0 :(得分:7)

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

我应该强调你的catch块 必须 处于继承层次结构顺序;也就是说,您可能不会声明catchParentException后跟ChildException,因为这是编译错误。您拥有的内容(就catch块而言)是有效的。

更常见的用例是处理文件IO时;如果错误的具体程度低于FileNotFoundException,您可以先抓住IOException,然后抓住FileNotFoundException