Java finally块更改类变量的值,但不更改Try块中的return语句

Java finally块更改类变量的值,但不更改Try块中的return语句,java,try-catch-finally,finally,Java,Try Catch Finally,Finally,我已经解释过这种行为,因为它在finally块中通常是一个不可变的字符串,但我不明白为什么int原语会这样 “i”不是作为方法中的参数按值传递的。该方法直接设置i类变量。这是显而易见的,因为在方法完成后打印时i的值会发生变化 很明显,它在try块中的return语句之前已经更改,因为finally块中的print首先打印 public class Test { static int i = 0; public static void main(String[] args) {

我已经解释过这种行为,因为它在finally块中通常是一个不可变的字符串,但我不明白为什么int原语会这样

“i”不是作为方法中的参数按值传递的。该方法直接设置i类变量。这是显而易见的,因为在方法完成后打印时i的值会发生变化

很明显,它在try块中的return语句之前已经更改,因为finally块中的print首先打印

public class Test {
    static int i = 0;
    public static void main(String[] args) {

        System.out.println("Try Block returns: " + methodReturningValue());
        System.out.println("Value of i after method execution is " + i);
    }


    static int methodReturningValue()
        {


            try
            {
                i = 1;
                System.out.println("try block is about to return with an i value of: "+  i);
                return i;
            }
            catch (Exception e)
            {
                i = 2;
                return i;
            }
            finally
            {
                i = 3;
                System.out.println("Finally block: i has been changed to 3");
            }
        }


    }
输出:

try block is about to return with an i value of: 1
Finally block: i has been changed to 3
Try Block returns: 1
Value of i after method execution is 3

是的,
finally
block总是在“return”和“throw”异常之后运行,您的代码如下所示:

公共类测试{
静态int i=0;
公共静态void main(字符串[]args){
System.out.println(methodReturningValue());
系统输出打印LN(i);
}
静态int methodReturningValue()
{
int-answer=0;
尝试
{
i=1;
答案=i;
}
捕获(例外e)
{
i=2;
答案=i;
}
i=3;
System.out.println(“i=3”);
返回答案;
}
}

可能有助于“我已经看到了这种行为的解释,因为它通常是一个不可变的字符串”,您在哪里看到过这种解释?这种解释毫无意义。在finally中为字段或变量指定不同的值不会影响使用
return
返回的值。Java是按值传递的,而不是按引用传递的。但是,我认为您将在变量中重新分配新值与更改变量引用的对象的内容混淆了。评估顺序,不是不变性等。dung ta van,它不是在“返回”之前运行吗?这不是打印语句所指示的吗?dung ta van,检查输出。在try返回之前执行finally块:在try block return之前,i已被更改为值3 try block returns:1方法执行后i的值为:3I不清楚您的确切意思是,如果
最终
出现,函数将创建一个临时变量(答案)。它首先打印(i=3),然后返回'answer',因为'answer'的类型是int(值类型),所以它的值没有改变,如果使用AtomicInteger,您将得到答案'i=3,3,3`公共类测试{static AtomicInteger i=new AtomicInteger();公共静态void main(字符串[]args){System.out.println(methodReturningValue();System.out.println(i);}静态原子整数methodReturningValue(){try{i.set(1);return i;}catch(异常e){i.set(2);return i;}最终{i.set(3);System.out.println(“i=3”);}}}}}}}问题是为什么OP的代码与此代码的工作原理不同,而这一点是肯定的。