java: try finally blocks execution

This question already has an answer here:

  • Does finally always execute in Java? 50 answers
  • Strange finally behaviour? 7 answers

  • When you return from try block, the return value is stored on the stack frame for that method. After that the finally block is executed.

    Changing the value in the finally block will not change the value already on the stack. However if you return again from the finally block, the return value on the stack will be overwritten, and the new x will be returned.

    If you print the value of x in finally block, you will get to know that it is executed, and the value of x will get printed.

    static int test(){
        int x = 1;
        try{
            return x;
        }
        finally{
            x = x + 1;
            System.out.println(x);  // Prints new value of x
        }
    }
    

    Note: In case of a reference value being returned, the value of reference is stored on the stack. In that case, you can change the value of object, using that reference.

    StringBuilder builder = new StringBuilder("");
    try {
        builder.append("Rohit ");
        return builder;
    
    } finally {
        // Here you are changing the object pointed to by the reference
        builder.append("Jain");  // Return value will be `Rohit Jain`
    
        // However this will not nullify the return value. 
        // The value returned will still be `Rohit Jain`
        builder =  null;
    }
    

    Suggested Read:

  • JVM Specs - Frames

  • The finally block is executed. The local variable is incremented. But the value of that local variable has already been copied for the return value.

    From the Java Language Specification, 14.17: The return statement:

    A return statement with an Expression attempts to transfer control to the invoker of the method that contains it; the value of the Expression becomes the value of the method invocation.

    ...

    The preceding descriptions say "attempts to transfer control" rather than just "transfers control" because if there are any try statements (§14.20) within the method or constructor whose try blocks or catch clauses contain the return statement, then any finally clauses of those try statements will be executed, in order, innermost to outermost, before control is transferred to the invoker of the method or constructor. Abrupt completion of a finally clause can disrupt the transfer of control initiated by a return statement


    You are returning x before you exit try. I would do this:

    public class TryCatchTest {
        public static void main(String[] args) {
            System.out.println(test());
        }
        static int test() {
            int x = 1;
            try {
                do something with x.
            } finally {
                do something that will happen even in case of error;
                x = x + 1;
                return x;
            }
        }
    }
    
    链接地址: http://www.djcxy.com/p/73696.html

    上一篇: 当最后执行?

    下一篇: java:尝试最后阻止执行