我有一个带有父类的已检查异常的方法,它可以抛出父类和子类的异常
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的实例?
答案 0 :(得分:7)
catch
块将始终捕获可用的最具体的异常,从继承层次结构向上运行。
我应该强调你的catch块 必须 处于继承层次结构顺序;也就是说,您可能不会声明catch
块ParentException
后跟ChildException
,因为这是编译错误。您拥有的内容(就catch
块而言)是有效的。
更常见的用例是处理文件IO时;如果错误的具体程度低于FileNotFoundException
,您可以先抓住IOException
,然后抓住FileNotFoundException
。