java:尝试最后阻止执行

这个问题在这里已经有了答案:

  • 最终总是在Java中执行? 50个答案
  • 奇怪的最后的行为? 7个答案

  • try块返回时,返回值将存储在该方法的堆栈帧中。 之后,finally块被执行。

    更改finally块中的值不会更改堆栈中已有的值。 但是,如果您从finally块中再次返回,堆栈上的返回值将被覆盖,并且新的x将被返回。

    如果你在finally块中打印x的值,你会知道它被执行,并且x的值将被打印出来。

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

    注意:如果返回参考值,参考值将存储在堆栈中。 在这种情况下,您可以使用该引用更改对象的值。

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

    建议阅读:

  • JVM规范 - 框架

  • finally块被执行。 局部变量增加。 但是该局部变量的值已经被复制为返回值。

    从Java语言规范14.17:return语句:

    带有表达式的返回语句尝试将控制转移给包含它的方法的调用者; Expression的值将成为方法调用的值。

    ...

    前面的描述说“试图转移控制”而不是“转移控制”,因为如果在try或catch子句中包含返回语句的方法或构造函数中有任何try语句(§14.20),那么这些语句的任何finally子句在控制转移给方法或构造函数的调用者之前,将按顺序执行try语句,从最内层到最外层。 突然完成finally子句可能会中断由return语句启动的控制权转移


    在退出尝试之前,您正在返回x。 我会这样做:

    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/73695.html

    上一篇: java: try finally blocks execution

    下一篇: try/finally without catch and return value