經常會遇到,經常會混淆,所以記錄一下
主要有3種情況
1.內容中有return,finally中沒有return
2.內容中有return,finally中有return
3.內容中有return,finally中沒有return,但是會改變返回值的情況,就這個會混淆
下面看代碼
場景1:
package com.qhong;
public class Main {
public static void main(String[] args) {
System.out.println(test());
}
private static int test(){
int num = 10;
try{
System.out.println("try");
return num += 80;
}catch(Exception e){
System.out.println("error");
}finally{
if (num > 20){
System.out.println("num>20 : " + num);
}
System.out.println("finally");
}
return num;
}
}
Output:
try
num>20 : 90
finally
90
場景2:
package com.qhong;
public class Main {
public static void main(String[] args) {
System.out.println(test());
}
private static int test(){
int num = 10;
try{
System.out.println("try");
return num += 80;
}catch(Exception e){
System.out.println("error");
}finally{
if (num > 20){
System.out.println("num>20 : " + num);
}
System.out.println("finally");
num = 100;
return num;
}
}
}
Output:
try
num>20 : 90
finally
100
場景3:
package com.qhong;
public class Main {
public static void main(String[] args) {
System.out.println(test());
}
private static int test(){
int num = 10;
try{
System.out.println("try");
return num;
}catch(Exception e){
System.out.println("error");
}finally{
if (num > 20){
System.out.println("num>20 : " + num);
}
System.out.println("finally");
num = 100;
}
return num;
}
}
Output:
try
finally
10
總結:
可以看出,
流程是先運行try內部代碼,判斷finally中是否有return,
如果有,那么就不執行try中的return,繼續執行finally中的代碼
如果沒有,那么執行finally中代碼,再執行try的return。
嗯,最麻煩的就是try中return返回的是一個方法,那么在finally有return的時候,方法里面不涉及返回值的代碼可以執行,涉及的就不執行,反正就這么招了,一般不要這么干!