在Java中,我有一个方法来捕获扩展'NewException'的异常'ChildException'。如果该方法调用另一个抛出'NewException'的方法,让我们说某事发生并抛出它;捕获异常抛出的子类的调用者方法会捕获它吗?
public MethodCatchingChildException
{
try
{
//stuff
callingMethodThrowingNewException();
//stuff
}
catch (ChildException e)
{
//stuff
}
}
在MethodCatchingChildException中是否会捕获来自callingMethodThrowingNewException的异常?
答案 0 :(得分:3)
catch
子句将捕获与声明的异常类型赋值兼容的任何异常。在您描述的情况下,NewException
的实例(不是ChildException
将不会被catch
子句捕获,因为您无法将NewException
对象分配给{ {1}}变量。
规则在section 14.20.1 of the Java Language Specification中详细说明:
如果由于抛出值V而导致try块的执行突然完成,那么可以选择:
如果V的运行时类型与try语句的任何catch子句的可捕获异常类(§5.2)兼容,则选择第一个(最左边)这样的catch子句。将值V分配给所选catch子句的参数,并执行该catch子句的Block,然后有一个选择:
如果该块正常完成,则try语句正常完成。
如果该块因任何原因突然完成,则try语句会因同样的原因突然完成。
如果V的运行时类型与try语句的任何catch子句的可捕获异常类不兼容,那么try语句会因为抛出值V而突然完成。
答案 1 :(得分:1)
将其视为 instanceof 测试
e.g。
if (e instanceof ChildException) {
...
}
因此,指定类类型将捕获类和其子类。
答案 2 :(得分:0)
它只会捕获您指定的Exception或它的子类。只需编写它就可以捕获父Exception并保证您的安全。