finally 一定会执行
try-catch-finally中return的执行情况:
-
在try中没有异常的情况下try、catch、finally的执行顺序 try --- finally
-
如果try中有异常,执行顺序是try --- catch --- finally
-
如果try中没有异常并且try中有return这时候正常执行顺序是try ---- finally --- return
-
如果try中有异常并且try中有return这时候正常执行顺序是try----catch---finally--- return
总之 finally 永远执行!
- 不管有没有异常,finally中的代码都会执行
- 当try、catch中有return时,finally中的代码依然会继续执行
- finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的。
- 如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,try中的return语句返回的就是在finally中改变后的该属性的值。
- finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值
return的返回值:
public static void main(String[] args) {
System.out.println("return的返回值:" + test());
}
// finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,
//而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。
//也就是说方法的返回值是在finally运算之前就确定了的。
static int test() {
int x = 1;
try {
return x++; //先return,后+1,返回值为1
} catch(Exception e){
}finally {
System.out.println("finally:" + x);
++x;
System.out.println("++x:" + x);
// finally代码中最好不要包含return,程序会提前退出,
// 也就是说返回的值不是try或catch中的值,而是finally中的值
// return x;
}
return 5;
}
运行结果:
finally:2
++x:3
return的返回值:1
包含异常return的返回值:
public static void main(String[] args) {
System.out.println("包含异常return的返回值:" + testWithException());
}
static int testWithException(){
Integer x = null;
try {
x.intValue(); // 造个空指针异常
return x++;
} catch(Exception e){
System.out.println("catch:" + x);
x = 5;
// return x; // 返回5
return ++x; // 返回6
}finally {
x = 10;
System.out.println("finally:" + x);
++x;
System.out.println("++x:" + x);
// finally代码中最好不要包含return,程序会提前退出,
// 也就是说返回的值不是try或catch中的值
// return x;
}
}
结果如下:
catch:null
finally:10
++x:11
包含异常return的返回值:6
返回值类型是对象时return的返回值:
public static void main(String[] args) {
System.out.println("返回值类型是对象时return的返回值:" + testWithObject().age);
}
//如果return的数据是引用数据类型,而在finally中对该引用数据类型的属性值的改变起作用,
//try中的return语句返回的就是在finally中改变后的该属性的值。
static Num testWithObject() {
Num num = new Num();
try {
return num;
} catch(Exception e){
}finally {
num.age=5; // 改变了引用对象的值
System.out.println("finally:" + num.age);
}
return num;
}
static class Num{
public int age;
}
结果如下:
finally:5
返回值类型是对象时return的返回值:5