In java,what if both try and catch throw same exception and finally has a return?

吃可爱长大的小学妹 提交于 2020-01-09 11:42:53

问题


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

Why is the return value 4?


回答1:


That's the way finally works. The snippet

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

will complete abruptly, but the finally clause will kick in and when it returns it discards the original reason for completing the statement.

This is explained in section Blocks and Statements in the Java Language Specification. I've highlighted the relevant path in your situation:

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:
    • ...



回答2:


You should never return from a finally block. This is very bad practice. See Java try-finally return design question and Does finally always execute in Java?.




回答3:


There are several questions on StakOverflow that explain this.

To make it simple: if you put a return or a throw statement in a finally clause this is the last action of your method. Generally speaking this is a bad practice though.




回答4:


Finally will always return 4. The finally block will always execute regardless of any exception that is throw in the try and catch blocks.




回答5:


The fact that the finally block returns a value causes the thrown exception to be swallowed, so it wont propagate out of the method.



来源:https://stackoverflow.com/questions/5126455/in-java-what-if-both-try-and-catch-throw-same-exception-and-finally-has-a-return

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!