finally+finally执行时机
前两天看了篇文档,里面讲解了finally的执行情况和返回值的情况。讲的还挺细致,既回忆复习了一下基础也新学到了一些之前没有注意的知识点,稍作整理,分享给大家。
正常 都知道try或catch执行后 就会执行finally中的语句(一开始都是説finally中的语句是一定会执行的 也是这么记忆的(😏)),
finally的特点
被finally控制的语句体一定会执行(这是我们平时的认知)
But 请注意
finally不会被执行的几种情况:
在try前制造一个异常(或直接return) 不走进try里面 finally自然也就不会执行了
特殊情况:在执行到finally之前jvm退出了(比如System.exit(0)--这是退出java虚拟机)
进了try finally都会执行 只要你不这样System.exit(0)
这是finally的特点,这些其实一般也都记得住,正常 都知道try或catch执行后 就会执行finally中的语句,但是如果try中有return catch里面有return,finally的执行顺序呢?还有如果try/catch/finally都有return 那最后到底return的是那个值呢?(以前关注这个问题 是在牛客网上刷题遇到的)
finally的执行顺序
try中有return:
public class TryCatchTest {
private static int total() {
try {
System.out.println("执行try");
return 11;
} finally {
System.out.println("执行finally");
}
}
public static void main(String[] args) {
System.out.println("执行main:" + total());
}
}
输出结果:
执行try
执行finally
执行main:11
结论:finally块执行在try块的return之前。
try/catch中有return语句:
public class TryCatchTest {
private static int total() {
try {
System.out.println("执行try");
return 1 / 0;
} catch (Exception e) {
System.out.println("执行catch");
return 11;
} finally {
System.out.println("执行finally");
}
}
public static void main(String[] args) {
System.out.println("执行main:" + total());
}
}
输出结果:
执行try
执行catch
执行finally
执行main:11
同样的,finally执行在catch块return的执行前。
结论:finally在try/catch后执行,如果try/catch中有return语句,finally在return前执行
finally块中的返回值
1.finally块不含返回值,但是可以改变变量值
看一个例子:
public class TryCatchTest {
private static int total() {
int i = 0;
try {
System.out.println("执行try:" + i);
return i;
} finally {
++i;
System.out.println("执行finally:" + i);
}
}
public static void main(String[] args) {
System.out.println("执行main:" + total());
}
}
//输出结果:
//执行try:0
//执行finally:1
//执行main:0
我们经过前面的分析,finally块的执行时机应该是return之前,那理论上我们应该先++i
使得i等于1
,在执行return i;
自然会返回1。
可是结果却返回了0,这是因为Java程序会把try或者catch块中的返回值保留,也就是暂时的确认了返回值,然后再去执行finally代码块中的语句。等到finally代码块执行完毕后,如果finally块中没有返回值的话,就把之前保留的返回值返回出去。
2.finally中含有返回值
示例1:
public class TryCatchTest {
private static int total() {
try {
System.out.println("执行try");
return 1;
} finally {
System.out.println("执行finally");
return 2;
}
}
public static void main(String[] args) {
System.out.println("执行main:" + total());
}
}
//输出结果:
//执行try
//执行finally
//执行main:2
结论:finally 中有 return 语句,这个返回值将会覆盖前面(try/catch)中的返回值
示例2:
public class TryCatchTest {
private static int total() {
int i = 1;
try {
System.out.println("执行try:" + i);
return i;
} finally {
++i;
System.out.println("执行finally:" + i);
return i;
}
}
public static void main(String[] args) {
System.out.println("执行main:" + total());
}
}
//输出结果:
//执行try:1
//执行finally:2
//执行main:2
结论:finally中的return 在try/catch中的return执行后 再执行,所以finally中有 return语句,这个返回值将会覆盖前面(try/catch)中的返回值
示例3:
public class TryCatchTest {
private static int total() {
int i = 1;
try {
System.out.println("执行try:" + i);
} finally {
++i;
System.out.println("执行finally:" + i);
}
return i;
}
public static void main(String[] args) {
System.out.println("执行main:" + total());
}
}
//执行结果:
//执行try:1
//执行finally:2
//执行main:2
finally块之后的方法有return,则return的值就是进行完上面的操作后的return值。
结论
finally的特点
被finally控制的语句体一定会执行(这是我们平时的认知)
But 请注意
finally不会被执行的几种情况:
在try前制造一个异常(或直接return) 不走进try里面 finally自然也就不会执行了
特殊情况:在执行到finally之前jvm退出了(比如System.exit(0)--这是退出java虚拟机)
进了try finally都会执行 只要你不这样System.exit(0)
这是finally的特点,这些其实一般也都记得住,正常 都知道try或catch执行后 就会执行finally中的语句,但是如果try中有return catch里面有return,finally的执行顺序呢?还有如果try/catch/finally都有return 那最后到底return的是那个值呢?(以前关注这个问题 是在牛客网上刷题遇到的)
Try/catch finally 关于return问题
try/catch中有return语句, finally里中的代码会在return前执行finally里面的代码。
try/catch中有return语句,finally 中的return 在try/catch中的return语句执行后再执行,finally 中的return 语句,这个返回值将会覆盖try/catch中的返回值。
finally块之后的方法有return,则return的值就是进行完上面的操作后的return值。
最后
凡心所向,素履以往。