如果调用在 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"。他们在说不同的话。