假设我有一个方法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
那么就没有问题可以理解了。为什么不反过来呢?
答案 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
,并且1}}特定区块将不会被使用。
或者,更改ChildException
:
doSomething()
答案 1 :(得分:1)
如果您的代码抛出ChildException child
,您可以使用Exception parent
来抓住它,因为ChildException extends Exception
,因此child
可分配给parent
,即您可以写一些东西像
Exception parent = child;
但是如果你的代码说你正在抛出Exception
,那么编译器会将你带到面值并假设你的方法抛出的异常类型可以是Exception
或类的任何子类。 Exception
本身。
例如,您的方法可能会抛出另一个ChildException2
。因此,在这种情况下,它不能在main方法的catch子句中赋值给ChildException
。 ChildException2
既未处理也未声明。
因此,编译器不允许您继续只捕获ChildException
并要求您捕获类型Exception
或声明它。