子类 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 块会捕获已检查的父异常吗?的主要内容,如果未能解决你的问题,请参考以下文章