如果调用在 try/catch 块中并且该方法也抛出异常,那么 catch 是否具有优先权?
If a call is in a try/catch block and the method also throws the exception, will the catch have precedence?
如果声明该方法抛出与某些代码抛出的异常相同的异常,并且该代码也包含在 try/catch 中,异常会被 catch 捕获还是仍会抛出错误?虽然我不是 100% 确定,但我猜 catch 有优先权。
每个 catch 块都是一个异常处理程序,用于处理由其参数指示的异常类型。一旦异常被处理,它就不会再被抛出,除非你在 catch 块中重新抛出异常。
如果我没理解错的话,你是在问:
void someMethod() throws SomeException {
try {
doSomethingElse()
} catch (SomeException e) {
// is this reached or does it throw from the method?
}
}
catch 子句将被触发,异常被视为已处理。除非你从那个块中重新抛出它,否则它不会逃脱该方法。
在我的示例中,您的方法不需要声明它抛出 SomeException
,因为它不会。
这不是一个构造 "taking precedence" 优于另一个构造的问题。他们在说不同的话。
(借用@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
具有不同行为的子class 会怎样?现在,目标对象的实际class会影响异常是否发生。
但是通过所有这些,方法声明中throws SomeException
的含义保持不变。它告诉编译器,无论何时调用此方法,调用者 必须 处理检查异常的可能性......即使没有办法将代码 as当前编写的 可以传播该异常。
回顾一下。都没有 "takes precedence"。他们在说不同的话。
如果声明该方法抛出与某些代码抛出的异常相同的异常,并且该代码也包含在 try/catch 中,异常会被 catch 捕获还是仍会抛出错误?虽然我不是 100% 确定,但我猜 catch 有优先权。
每个 catch 块都是一个异常处理程序,用于处理由其参数指示的异常类型。一旦异常被处理,它就不会再被抛出,除非你在 catch 块中重新抛出异常。
如果我没理解错的话,你是在问:
void someMethod() throws SomeException {
try {
doSomethingElse()
} catch (SomeException e) {
// is this reached or does it throw from the method?
}
}
catch 子句将被触发,异常被视为已处理。除非你从那个块中重新抛出它,否则它不会逃脱该方法。
在我的示例中,您的方法不需要声明它抛出 SomeException
,因为它不会。
这不是一个构造 "taking precedence" 优于另一个构造的问题。他们在说不同的话。
(借用@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
具有不同行为的子class 会怎样?现在,目标对象的实际class会影响异常是否发生。
但是通过所有这些,方法声明中throws SomeException
的含义保持不变。它告诉编译器,无论何时调用此方法,调用者 必须 处理检查异常的可能性......即使没有办法将代码 as当前编写的 可以传播该异常。
回顾一下。都没有 "takes precedence"。他们在说不同的话。