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

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;
        }
    }
}

为什么返回值为4?

最佳答案
这就是最终的工作方式.片段

try {
    throw new Exception();
} catch(Exception e) {
    throw new Exception();
}

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

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

A try statement with a
finally block is executed
by first executing the
try block. Then there is
a choice:

  • If
    execution of the try
    block completes normally, then the
    finally block is
    executed, and then there is a choice:

  • If execution
    of the try block
    completes abruptly because of a
    throw of a value
    V, then there is a choice:

    • If
      the run-time type of V is
      assignable to the parameter of any
      catch clause of the
      try statement, then the
      first (leftmost) such
      catch clause is selected.
      The value V is assigned to the
      parameter of the selected
      catch clause, and the
      Block of that
      catch clause is executed.
      Then there is a choice:

      • If the
        catch block completes
        normally, then the
        finally block is
        executed. Then there is a choice:

      • If the
        catch block completes
        abruptly for reason R, then the
        finally block is
        executed. Then there is a choice:

        • If the
          finally block completes
          normally, then the try
          statement completes abruptly for
          reason R.
        • If the finally
          block completes abruptly for reason
          S, then the try
          statement completes abruptly for
          reason S (and reason R
          is discarded).

    • If the run-time type of V
      is not assignable to the parameter of
      any catch clause of the
      try statement, then the
      finally block is
      executed. Then there is a choice:

  • If execution of the
    try block completes
    abruptly for any other reason
    R, then the
    finally block is
    executed. Then there is a choice:

转载注明原文:在java中,如果try和catch都抛出相同的异常并最终返回怎么办? - 代码日志