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

Posted

技术标签:

【中文标题】子类 catch 块会捕获已检查的父异常吗?【英文标题】:Will a subclass catch block catch a checked parent exception? 【发布时间】:2016-11-21 09:05:59 【问题描述】:

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

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】:

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

我要强调的是,你的 catch 块必须在继承层次顺序中;也就是说,你不能用ParentException 后跟ChildException 声明一个catch 块,因为那是编译错误。你所拥有的(就catch 块而言)是有效的。

一个更常见的用例是在处理文件 IO 时;如果错误不如FileNotFoundException 具体,您可以先捕获FileNotFoundException,然后再捕获IOException

【讨论】:

所以它会首先进入,执行类似内部实例的操作? @Sajhu 是的,它将进入第一个 catch 子句。

以上是关于子类 catch 块会捕获已检查的父异常吗?的主要内容,如果未能解决你的问题,请参考以下文章

Java基础 try...catch...catch 使用众多异常的父类 Exception,去捕 获 其所有子类异常

异常的捕获和处理

Adwords API 异常抛出

异常处理

总结八

4.异常