据我所知,如果静态变量的值在一个地方改变,那么它将反映在所有地方。例如
static int i=0;
public static void test1()
{
System.out.println(i);
i=100;
}
public static int test2()
{
return i;
}
test1()的sysout - 0 test2()的sysyout = 100; 再次测试sys1()= 0
的sysout我很清楚这一点。
但我不清楚下面的代码
public static int test() {
try {
i = 2;
System.out.println("before "+i);
return i;
} finally {
i = 12;
System.out.println("in finally");
}
}
那么为什么它打印2即使静态的i的值改为12; 下面是方法调用的序列;
test1();
System.out.println(test2());
test1();
System.out.println(test());
输出
0
100
100
before 2
in finally
2
修改
当我调试时,我发现流程为try block-> finally block-> try blocks return语句。所以在这种情况下,在控制转到return语句之前,最后执行block。所以这意味着i的值是12,那么为什么它没有返回12
答案 0 :(得分:3)
这是一种正常行为,因为您打印的最后一个2
只是方法test()
的返回值。并且,当在finally块之前执行返回时,意味着i
的值将在i
的值更改之前复制到返回值中。
如果在执行方法System.out.println(i);
后执行test()
,则会打印12
。
〜费边
答案 1 :(得分:2)
您打印出test()
的返回值作为您做的最后一件事,而不是i
。
执行return i
时,会评估i
。所以那时你正在有效地做return 2;
。因此,由于i
已经被评估为2,所以在finally块中更改它并不会影响return语句中已经评估的值。
如果你这样做
System.out.println(test());
System.out.println(i);
您会看到i
是12。
有关详细信息,请参阅this。
答案 2 :(得分:1)
它打印'2'因为当test()
返回i
时,它返回当前值i
,而不是使用它时的任何值。并且,当值为“2”时,您返回i
,当您打印它时,它将打印返回时的值。对于所有基本类型都是如此,例如int
,boolean
,double
等。但是,如果返回一个Object,每当您对返回的对象进行更改时,您都将对原始对象进行更改。
答案 3 :(得分:0)
public static int test() {
try {
i = 2;
System.out.println("before "+i);
} finally {
i = 12;
System.out.println("in finally");
return i;
}
}
我上面更改了你的test()代码,因为我认为我知道这个问题。 当您调用System.out.println(test());时,您的旧代码返回值2.
这种情况正在发生,因为当我实际上等于2时,你调用了返回语句(在try块中)。它有点奇怪的java仍然执行finally块,但那就是生活!
你希望它返回12是吗?然后将return语句添加到finally块。它会给你一些可以抑制的警告但是继续。