2014-09-29 145 views
2

在Java中,我有一个方法捕获一个扩展'NewException'的异常'ChildException'。如果该方法调用另一个抛出'NewException'的方法,并让我们说发生了什么并抛出它;将捕获抛出的异常的子类的调用方法捕获它吗?将捕获异常捕获该异常的父类

public MethodCatchingChildException 
{ 
    try 
    { 
    //stuff 
    callingMethodThrowingNewException(); 
    //stuff 
    } 
    catch (ChildException e) 
    { 
    //stuff 
    } 
} 

那么调用MethodThrowingNewException的异常会在MethodCatchingChildException中被捕获吗?

+2

你有它向后。抓住父母会抓住孩子,但不是相反。 – 2014-09-29 16:07:28

+0

我很抱歉,但你可以只写代码,看看结果 – sotcha 2014-09-29 16:10:44

+0

好吧,其实我不能在哪里。这就是我在这里问的原因。我正在研究一些不属于我的代码,无法编译。 – 2014-09-29 16:14:56

回答

2

A catch子句将捕获与异常的声明类型分配兼容的任何异常。在这种情况下你描述的NewException实例(这不是一个ChildException不会受catch子句捕获,因为你不能一个NewException对象分配给ChildException可变

的规则在section 14.20.1 of the Java Language Specification阐明:

如果try块的执行突然完成,因为值V的抛,然后有一个选择:

  • 如果V的运行时类型是分配COMPAT可以使用(§5.2)try语句的任何catch子句的可捕获异常类,然后选择第一个(最左边的)这样的catch子句。的值V被分配给所选择的catch子句的参数,并且执行该catch子句的块,然后有一个选择:

    • 如果块正常完成,则try语句正常完成。

    • 如果该块由于任何原因突然完成,则由于相同的原因,try语句突然完成。

  • 如果V的运行时类型不是分配与可捕获的异常类try语句中的任何catch子句的兼容,那么try语句突然结束,因为该值V.

    的抛它
0

它只会捕获您指定的异常或它的子类。只需编写它,以便捕获父异常,并且您很安全。

1

想作为一个的instanceof测试

例如

if (e instanceof ChildException) { 
... 
} 

因此指定一个类的类型将捕获类它的子类。