以前一直认为在try,catch,finally中,try中的return 会在finally之后运行,今天和同事遇到,然后重新测试了一下,代码如下:
/**
* 主方法
*
* @param args
*/
public static void main(String[] args) {
exexute();
}
/**
* 测试方法
*
* @return
*/
private static int exexute() {
try {
System.out.println("this is atest");
return exexutea();
}
catch (Exception ex) {
ex.printStackTrace();
}
finally {
System.out.println("finally");
}
return 0;
}
/**
* return 方法
*
* @return
*/
private static int exexutea() {
System.out.println("exexutea");
return 1;
}
执行结果是:
this is atest
exexutea
finally
觉得和自己想的不太一样吧。发现自己的记性不太好了...
后来在网上查询,看到有网友举了另外一个例子,来研究是不是finally对return 是不是有影响。
网友举了两个例子,一个是return 简单数据类型,另一个是放回包装数据类型。代码如下:
简单数据类型的例子:
/**
* 主方法
*
* @param args
*/
public static void main(String[] args) {
int re = executeSimple();
System.out.println(re);
}
/**
* 测试简单数据类型
*
* @return
*/
private static int executeSimple() {
int i = 10;
try {
System.out.println("this is a test simple");
return i;
}
catch (Exception ex) {
ex.printStackTrace();
}
finally {
i = 5;
}
return i;
}
执行结果是:
this is a test simple
10
看来finally的赋值并没有对return造成影响
包装数据类型的例子:
/**
* 主方法
*
* @param args
*/
public static void main(String[] args) {
StringBuilder re = executeComplex();
System.out.println(re.toString());
}
/**
* 测试简单数据类型
*
* @return
*/
private static StringBuilder executeComplex() {
StringBuilder sb = new StringBuilder("123");
try {
System.out.println("this is a test simple");
return sb;
}
catch (Exception ex) {
ex.printStackTrace();
}
finally {
sb.append("321");
}
return sb;
}
执行结果:
this is a test simple
123321
执行结果受到了finally的影响。
虚拟机栈中的返回分简单数据类型和复杂数据类型,如果是简单数据类型,虚拟机栈直接记录的是字面量,如果是复杂数据类型,那么虚拟机记录的引用,所以在第二个例子中,改变了引用对象的内容,return 以后,引用的内容就改变了。