版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/J080624/article/details/84671017
try catch finally 常见格式如下:
try{
//应用代码
}catch(Exception e){
//异常捕捉处理
}finally{
//资源释放、流关闭等等
}
通常执行顺序:
- try有异常时,try-catcy-finally
- try无异常时,try-finally
那么如果有返回值呢?try catch finally 每个部分均有return语句呢?finally中抛出异常呢?下面逐个实践分析。
① 不抛异常,方法末尾处return
测试代码如下:
public class TestTryCatch {
public static void main(String[] args){
int test1 = test1();
System.out.println("main block : "+test1);
}
public static int test1(){
int i = 1;
try{
i++;
System.out.println("try block, i = "+i);
}catch(Exception e){
i++;
System.out.println("catch block i = "+i);
}finally{
i = 10;
System.out.println("finally block i = "+i);
}
return i;
}
}
测试结果如下:
try block, i = 2
finally block i = 10
main block : 10
每个部分,基本类型变量 i 都被修改值,最后返回值取finally中i的最终值。
② 在try catch 部分放return语句
测试代码如下:
public static int test2(){
int i = 1;
try{
i++;
System.out.println("try block, i = "+i);
return i;
}catch(Exception e){
i++;
System.out.println("catch block i = "+i);
return i;
}finally{
i = 10;
System.out.println("finally block i = "+i);
}
}
测试结果如下:
try block, i = 2
finally block i = 10
main block : 2
注意,这里main中获取test2的返回值为 2 不是 10!
分析如下:
代码顺序执行从try到finally,由于finally是无论如何都会执行的,所以try里的语句并不会直接返回。
在try语句的return块中,return返回的引用变量并不是try语句外定义的引用变量i
,而是系统重新定义了一个局部引用i’
,这个引用指向了引用i对应的值,也就是2。
即使在finally语句中把引用i指向了值10,因为return返回的引用已经不是i
,而是i'
,所以引用i
的值和try语句中的返回值无关了。
查看test2编译后源码如下:
public static int test2() {
byte i = 1;
int var2;
try {
int i;
try {
i = i + 1;
System.out.println("try block, i = " + i);
int var1 = i;
return var1;
} catch (Exception var6) {
i = i + 1;
System.out.println("catch block i = " + i);
var2 = i;
}
} finally {
i = 10;
System.out.println("finally block i = " + i);
}
return var2;
}
可以看到try处返回的是var1 , 方法最后返回的是var2 !