抛出异常捕获childException ...为什么不呢?

时间:2017-07-22 07:46:48

标签: java exception

假设我有一个方法F1 F2 F3 F4 4 4 4 4 2 2 2 2 2 2 2 2 1 2 2 1 会抛出已检查的异常,然后在我的doSomething()方法中,我将main括在doSomething()中。

问题: 在try catch中说我throws Exception。为什么我的doSomething()方法无法catch (ChildException e)

我知道我不能,我必须抓住异常,但我不明白为什么。

main

如果我ChildException extends Exception.throws ChildException那么就没有问题可以理解了。为什么不反过来呢?

2 个答案:

答案 0 :(得分:3)

可以在主要方法中抓住ChildException,但由于您调用的方法定义为throws Exception,您还必须抓住Exception,因为编译器不知道doSomething 投掷ChildException。如果这是您想要的,那么您应该将doSomething定义为throws ChildException

例如,您可以执行以下设置:

try {
    doSomething();
} catch (ChildException e) {
    // handle child exception
} catch (Exception e) {
    // handle other exceptions
}

MC Emperor所述,catch块的顺序很重要,如果您反转顺序并先捕获Exception,那么该块也将处理ChildException,并且

或者,更改ChildException

doSomething()

答案 1 :(得分:1)

如果您的代码抛出ChildException child,您可以使用Exception parent来抓住它,因为ChildException extends Exception,因此child可分配给parent,即您可以写一些东西像

Exception parent = child;

但是如果你的代码说你正在抛出Exception,那么编译器会将你带到面值并假设你的方法抛出的异常类型可以是Exception或类的任何子类。 Exception本身。

例如,您的方法可能会抛出另一个ChildException2。因此,在这种情况下,它不能在main方法的catch子句中赋值给ChildExceptionChildException2既未处理也未声明。

因此,编译器不允许您继续只捕获ChildException并要求您捕获类型Exception或声明它。