先看几个例子,下面这四段代码输出的结果分别是什么呢?
第1段:
public class Mytest {
public static intreturnValue() {
int i = 0;
try{
i = 1;
return i =i + 5;
}finally{
i++;
//returni;
}
}
public static voidmain(String[] args) {
System.out.println(returnValue());
}
}
第二段:
public class Mytest {
public static intreturnValue() {
int i = 0;
try{
i = 1;
return i =i + 5;
}finally{
i++;
return i;
}
}
public static voidmain(String[] args) {
System.out.println(returnValue());
}
}
第三段:
public class Mytest {
public static intreturnValue() {
int i = 0;
try{
i = 1;
return i =i + 5;
}finally{
i = 4;
//returni;
}
}
public static voidmain(String[] args) {
System.out.println(returnValue());
}
}
第四段:
public class Mytest {
public static intreturnValue() {
int i = 0;
try{
i = 1;
return i =i + 5;
}finally{
i = 4;
return i;
}
}
public static voidmain(String[] args) {
System.out.println(returnValue());
}
}
以上四段代码的输出结果分别是:6、7、6、4。
原因分析:return语句用于退出本方法,如果try语句块中包含return语句,并且包含finally语句块,则代码会在执行到try语句块中的return语句时将返回值保存到局部变量中,然后跳转到finally语句里执行,执行完finally语句后再返回之前保存在局部变量里的值。第1段和第3段代码就是如此,在局部变量里保存的值为6(i=1,i=i+5则i=6),执行完finally语句后再执行return返回局部变量里的6。需要注意的是,如果finally语句块里也包含return语句,则会忽略try语句块里的return语句而使用finally语句块里的return语句(即finally语句块中的return语句会覆盖掉try语句块中的return语句),第2段和第4段代码就是如此,第2段代码finally语句块执行i++后使得i=7,接着执行return使得输出值为7,而不会再执行try语句块中的return语句返回局部变量里保存的6;第4段代码finally语句块执行i=4后接着执行return使得输出值为4,而不会再执行try语句块中的return语句返回局部变量里保存的6。