public class FinallyTest {
public static void main(String[] args) {
System.out.println(new FinallyTest().test());//这个打印结果为1.
System.out.println(new FinallyTest().get());// 这个打印结果为2.
}
//调这个就打印1
static int test() {
int x = 1;
try {
return x;
} finally {
++x;
}
}
//调这个就打印2
static public int get() {
try {
return 1;
} finally {
return 2;
}
}
}
finnaly不影响返回结果的,在return 之前,return的值被储存在临时变量里,finally无论做如何操作都不影响返回的值,除非在finnaly又返回了另外的值
//调这个就打印1
static int test() {
int x = 1;
try {
return x;
} finally {
++x;
}
}
这个方法调return x;点返回1 ,返回后变量x+1又。
//调这个就打印2
static public int get() {
try {
return 1;
} finally {
return 2;
}
}
第二个,执行到这里finally是必须执行的,无论你有没有错误都必须执行的,return 1的时候还没有执行完,所以继续执行,一看返回2执行完毕,所以返回2
JAVA
执行顺序是一行一行的,如果没有分歧就继续执行,有分歧就跳转分歧,执行完了回来继续执行。
程序中通常不会把return放在finnaly中
楼主可以试着这样玩一下
把return x;和return 1;都注释掉。
然后就可以看到IDE提示注释掉return x;的方法报错,注释掉return 1;的方法没有报错
再有一个需要说的是finally是java语法里已经定义好的,在方法返回之前都必须进行操作的代码块,因此在return后,jvm会把return的变量值(或者引用)保存在另一个地方,然后执行finally里面的代码,这时候如果你去改变x的值是没有任何作用了,因为返回值已经在另一个地方了,但是如果你在finally代码块里也有return语句时,这时新的return 里的变量会重新覆盖掉先前那个中间值上(也就是另一个地方的那个变量值,嘿嘿)。所以你的那个return x;之后再++是不起作用的。而return 1后再return 2 时是采取覆盖的方式。
当然,楼主可以看看下面的代码执行结果,想想为什么 这里的testa方法的返回值却可以通过finally来进行改变(java的引用 )
[code="java"]public class FinallyTest {
public static void main(String[] args) {
System.out.println(new FinallyTest().test());//这个打印结果为1.
System.out.println(new FinallyTest().get());// 这个打印结果为2.
System.out.println(new FinallyTest().testa().a);// 这个打印结果为2.
}
//调这个就打印1
static int test() {
int x = 1;
try {
return x;
} finally {
++x;
}
}
static A testa() {
A x = new A();
try {
x.a = "123";
return x;
} finally {
x.a="234";
x=null;
System.out.println(x);
}
}
//调这个就打印2
static public int get() {
try {
return 1;
} catch(Exception e){
return 3;
} finally {
return 2;
}
}
}
class A{
public String a;
}[/code]
因为返回的是对像的引用~~~
A x = new A();
try {
x.a = "123";
return x; //返回的是x的引用
} finally {
x.a="234";
x=null;
System.out.println(x);
}
而
int x = 1;
try {
return x; //返回的是基本类型
} finally {
++x;
}
java的原始类型
boolean
char
byte
short
int
long
float
double
这些是返回值本身,
而像对像返回的是引用 (类似指针)