总结:
-
1 finally语句在return语句执行之后return返回之前执行的
-
2 finally块中的return语句会覆盖try块中的return返回
-
3 如果finally语句中没有return语句覆盖返回值,那么原来的返回值可能因为finally里的修改而改变也可能不变
-
4 try块里的return语句在异常的情况下不会被执行,这样具体返回哪个看情况
-
5 当发生异常后,catch中的return执行情况与未发生异常时try中return的执行情况完全一样
先看示例代码:
public class FinallyTest1 {
public static void main(String []args){
System.out.println(test1());
System.out.println("-------------------------------------------------");
System.out.println(test2());
}
private static int test1() {
int b = 20;
try {
System.out.println("try语句块");
return b+=80;
}catch (Exception e){
System.out.println("catch语句块");
}finally {
System.out.println("finally语句块");
if (b>25){
System.out.println("b>25,b="+b);
}
}
return b;
}
private static int test2() {
int b = 20;
try {
System.out.println("try语句块");
return b+=80;
}catch (Exception e){
System.out.println("catch语句块");
}finally {
System.out.println("finally语句块");
if (b>25){
System.out.println("b>25,b="+b);
}
return 200;
}
}
}
结果:
try语句块
finally语句块
b>25,b=100
100
-------------------------------------------------
try语句块
finally语句块
b>25,b=100
200
说明return语句已经执行了,然后再去执行finally,等finally执行完后,再返回来return 结果。
这里finally语句块中有return,就直接return结束了,try语句块中的return根本不会再执行了。(finally块中的return语句会覆盖try块中的return返回)
接着看:
public class FinallyTest {
public static void main(String[] args) {
System.out.println(test());
System.out.println("-------------------------------------------");
System.out.println(getMap().get("key").toString());
}
public static int test() {
int b = 20;
try {
System.out.println("try block");
return b += 80;
} catch (Exception e) {
System.out.println("catch block");
} finally {
System.out.println("finally block");
if (b > 25) {
System.out.println("b>25, b = " + b);
}
b = 150;
}
return 2000;
}
public static Map<String,String> getMap(){
HashMap<String, String> map = new HashMap<>();
map.put("key","init");
try {
map.put("key","try");
return map;
}catch (Exception e){
map.put("key","catch");
}finally {
map.put("key","finally");
map=null;
}
return map;
}
}
结果:
try block
finally block
b>25, b = 100
100
-------------------------------------------
finally
为什么测试用例1中finally里的b = 150;并没有起到作用而测试用例2中finally的map.put("KEY", "FINALLY");起了作用而map = null;却没起作用呢?
这就是Java到底是传值还是传址的问题了,简单来说就是:Java中只有传值没有传址,这也是为什么map = null这句不起作用。
try块中的return在异常情况下不会执行
public class FinallyTest {
public static void main(String []args){
System.out.println(test1());
System.out.println("-------------------------------");
System.out.println(test2());
}
//try块中的return在异常情况下不会执行
private static int test1() {
int b = 20;
try {
System.out.println("try语句块");
b=b/0;
return b+=80;
}catch (Exception e){
b+=15;
System.out.println("catch语句块");
}finally {
System.out.println("finally语句块");
if (b>25){
System.out.println("b>25,b="+b);
}
b+=50;
}
return b;
}
//异常发生,catch中的return执行情况和未发生异常的try中return执行情况一样
private static int test2() {
int b = 20;
try {
System.out.println("try语句块");
b=b/0;
return b+=80;
}catch (Exception e){
System.out.println("catch语句块");
return b+=15;
}finally {
System.out.println("finally语句块");
if (b>25){
System.out.println("b>25,b="+b);
}
b+=50;
}
}
}
结果:
try语句块
catch语句块
finally语句块
b>25,b=35
85
-------------------------------
try语句块
catch语句块
finally语句块
b>25,b=35
35
这里try中发生了异常,try中没有return而是被catch,最后到了finally执行了了finally块中的命令
异常发生后,catch中的return语句先执行,确定返回值后再去执行finally,然后再返回catch中的return,finally中对b的改变不造成影响。
参考:https://blog.csdn.net/qq_36299025/article/details/89435275