如果声明该方法抛出某些代码抛出的相同异常,并且该代码也包含在try / catch中,那么异常会被catch捕获还是仍然会抛出错误?我猜这个捕获优先,虽然我不是100%肯定。
答案 0 :(得分:2)
如果我理解正确,你会问:
void someMethod() throws SomeException {
try {
doSomethingElse()
} catch (SomeException e) {
// is this reached or does it throw from the method?
}
}
将触发catch子句并将异常视为已处理。除非你从那个块中重新抛出它,否则它不会逃脱该方法。
在我的示例中,您的方法无需声明它会抛出SomeException
,因为它没有。
答案 1 :(得分:0)
每个catch块都是一个异常处理程序,它处理由其参数指示的异常类型。一旦处理了异常,除非你在catch块中重新抛出异常,否则不再抛出异常。
答案 2 :(得分:0)
这不是一个构造“优先于”另一个构成的问题。他们说的不同。
(借用@Duncan的例子......)
void someMethod() throws SomeException {
try {
doSomethingElse()
} catch (SomeException e) {
// is this reached or does it throw from the method?
}
}
此外,我将假设SomeException
是一个经过检查的例外。
这一行:
void someMethod() throws SomeException {
表示someMethod
>>可以<<抛出SomeException
。这是合同:方法的调用者需要允许的内容。
并不是说它>>做<<抛出异常。实际发生的是由方法体的行为决定的。在此示例中,正在捕获和处理异常,因此我们可以说即使someMethod
>>可以<<抛出异常,实际上它>>不是<<。
好的......但这不是故事的结局。
如果我们将方法的主体更改为不捕获异常怎么办?现在“>>不会<<”成为“>>可能<<< ...取决于doSomethingElse()
的签名及其行为。
如果我们使用不同的行为创建覆盖 someMethod
的子类,该怎么办?现在,目标对象的实际类将影响异常是否可以发生。
但是通过所有这些,方法声明中throws SomeException
的含义保持不变。它告诉编译器无论何时调用此方法,调用者必须处理已检查异常的可能性......即使代码无法像当前编写的那样可以传播该异常。
回顾一下。两者都没有“优先”。他们说的不同。