try、catch中有return,而finally中没有return
1、首先说明下,无论try、catch中是否有return,无论是否产生异常,finally代码是一定会执行的,代码验证如下:
public int handleTest1(){
int b=0;
try{
System.out.println("try");
int a=10/0;
System.out.println("try 1");
return b;
}
catch(Exception e){
System.out.println("catch ");
b=b+1;
return b;
//return str;
}
finally {
b=b+1;
System.out.println("finally");
//return 2;
}
}
public static void main(String[] args){
System.out.println("返回的结果"+new ExceptionHandle().handleTest1());
}
导致上述结果的原因在于,代码在执行完try或者catch之后,会将返回的结果保存,当执行完finally代码块时,再将保存的值返回。仔细观察上述代码,你会发现在finally代码块中将b+1,并没有对catch代码块中的返回值产生影响,这是因为b值是基本类型,catch代码块保存返回值时将b值复制了一份,产生了一份副本,返回的是b的副本的值,因此finally代码块中的b+1加的b本身,而不是副本上,因此不会对返回值有影响。验证代码如下,在finnally返回b,最终返回的值是2而不是1。
public int handleTest1(){
int b=0;
try{
System.out.println("try");
int a=10/0;
System.out.println("try 1");
return b;
}
catch(Exception e){
System.out.println("catch ");
b=b+1;
return b;
//return str;
}
finally {
b=b+1;
System.out.println("finally");
return b;
//return 2;
}
}
public static void main(String[] args){
System.out.println("返回的结果"+new ExceptionHandle().handleTest1());
}
2、若返回的值是引用数据类型时,则另当别论,在finally中修改try或者catch的返回值,会影响返回的结果,因为返回值为引用数据类型时返回的是对象本身,而不是副本,在finally代码块中修改返回值,修改的是对象本身的值,因此会影响返回的结果。验证代码如下:
public StringBuilder handleTest(){
StringBuilder sb=new StringBuilder("aaa");
try{
System.out.println("try"+sb);
int a=10/1;
return sb;
}
catch(Exception e){
System.out.println("catch 1");
//return str;
}
finally {
sb.append("bbb");
System.out.println("finally"+sb);
//return 2;
}
return null;
}
3、再者我们发现即使try中有return,但只要异常发生,返回的结果还是catch中的返回值,这是因为当检测到异常发生时,出现异常的代码后面的程序都不会得到执行,而是转向catch代码块执行,例如下面验证代码中得try1这个字符串没有得到输出。
public int handleTest1(){
try{
System.out.println("try");
int a=10/0;
System.out.println("try 1");
return 0;
}
catch(Exception e){
System.out.println("catch ");
return 1;
//return str;
}
finally {
System.out.println("finally");
//return 2;
}
}
public static void main(String[] args){
System.out.println("返回的结果"+new ExceptionHandle().handleTest1());
}
try、catch、finally中都有return
当try、catch代码块中都有return时,发生异常时返回的是catch代码块的值,那当try、catch、finally代码块中都有return时,那返回的是哪个代码块中的值?当finally正常结束返回的是try或者catch中的返回值,而当finally有return,就相当于finally代码块提前结束,返回的是finally代码块中的返回值。验证代码如下:
public int handleTest1(){
try{
System.out.println("try");
int a=10/0;
System.out.println("try 1");
return 0;
}
catch(Exception e){
System.out.println("catch ");
return 1;
//return str;
}
finally {
System.out.println("finally");
return 2;
}
}
public static void main(String[] args){
System.out.println("返回的结果"+new ExceptionHandle().handleTest1());
}