在java中,如果try和catch都抛出相同的异常并最终返回怎么办?

Cha*_*nth 4 java exception-handling

public class Abc {
    public static void main(String args[]) {
        System.out.println(Abc.method());
    }

    static int method() {
        try {
            throw new Exception();
        }
        catch(Exception e) {
            throw new Exception();
        }
        finally {
            return 4;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么返回值为4?

aio*_*obe 14

这是有效的方式finally.片段

try {
    throw new Exception();
} catch(Exception e) {
    throw new Exception();
}
Run Code Online (Sandbox Code Playgroud)

突然完成,但finally子句将启动,当它返回时,它会丢弃完成声明的原始原因.

这在Java语言规范中的块和语句一节中进行了解释.我已经强调了你情况中的相关路径:

通过首先执行块来执行try具有finally块 的语句 try.然后有一个选择:

  • 如果try 块的执行正常完成,则 finally执行块,然后有一个选择:
    • ...
  • 如果try块的执行由于throwV而突然完成 ,则可以选择:
    • 如果V的运行时类型可分配给语句的任何catch子句 的参数 try,则选择第一个(最左边)这样的 catch子句.将值V分配给selected catch子句的参数 ,并执行该 子句的 Blockcatch.然后有一个选择:
      • 如果 catch块正常完成,则 finally执行块.然后有一个选择:
        • ...
      • 如果 catch块因为原因R突然完成,则finally执行该 块.然后有一个选择:
        • 如果 finally块正常完成,则该try 语句突然完成的原因[R .
        • 如果finally 块因原因S而突然完成 ,则try 语句突然完成,原因为S(并且原因R 被丢弃).
    • 如果V的运行时类型 不能分配给catchtry语句的任何子句 的参数,则finally执行该 块.然后有一个选择:
      • ...
  • 如果 try由于任何其他原因R突然完成 finally块的执行,则执行该 块.然后有一个选择:
    • ...