如果调用在try / catch块中并且该方法也抛出异常,那么catch会优先吗?

时间:2015-03-09 08:52:43

标签: java exception

如果声明该方法抛出某些代码抛出的相同异常,并且该代码也包含在try / catch中,那么异常会被catch捕获还是仍然会抛出错误?我猜这个捕获优先,虽然我不是100%肯定。

3 个答案:

答案 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的含义保持不变。它告诉编译器无论何时调用此方法,调用者必须处理已检查异常的可能性......即使代码无法像当前编写的那样可以传播该异常。

回顾一下。两者都没有“优先”。他们说的不同。