java異常處理執(zhí)行順序詳解try catch finally
不含return的執(zhí)行順序
執(zhí)行順序為執(zhí)行try中代碼,如果沒有異常,然后執(zhí)行try catch后續(xù)的代碼。如:
public static void main(String[] args) {
try {
int j = 10 / 2;
System.out.println("執(zhí)行try中代碼!");
} catch (Exception e) {
e.printStackTrace();
System.out.println("執(zhí)行catch中代碼!");
}
System.out.println("執(zhí)行catch后的代碼!");
}
執(zhí)行結果為:

如果有異常,則try中異常后的代碼將不執(zhí)行,開始執(zhí)行catch中的代碼,執(zhí)行完成后,執(zhí)行try catch后續(xù)的代碼,示例代碼如下:
public static void main(String[] args) {
try {
int j = 10 / 0;
System.out.println("執(zhí)行try中代碼!");
} catch (Exception e) {
e.printStackTrace();
System.out.println("執(zhí)行catch中代碼!");
}
System.out.println("執(zhí)行catch后的代碼!");
}
執(zhí)行結果

發(fā)生異常語句后的代碼:System.out.println(“執(zhí)行try中代碼!”)不再執(zhí)行。
finally子句
使用try catch finally子句時,無論發(fā)生不發(fā)生異常,finally子句中的代碼都是要執(zhí)行,一般用于釋放資源、連接等操作。
public static void main(String[] args) {
try {
int i = 8/0;
System.out.println("執(zhí)行try中代碼!");
} catch (Exception e) {
System.out.println("執(zhí)行catch中代碼!");
} finally {
System.out.println("執(zhí)行finally中代碼!");
}
System.out.println("執(zhí)行try catch后的代碼!");
}
執(zhí)行try catch或try catch finally之后,執(zhí)行后續(xù)的代碼。
含return的執(zhí)行順序
如果不包含finally語句,在try子句和catch子句中均含有return語句,代碼遇到return語句則終止代碼的執(zhí)行,try catch后面的語句不可能得到執(zhí)行。

含有finally語句的try catch子句包含return語句執(zhí)行順序,執(zhí)行finally子句,然后執(zhí)行try或者catch的return語句,此時若finally語句包含return或終止運行,則try catch子句中的return語句將不執(zhí)行。如:
public static void main(String[] args) {
Integer i= testReturn();
System.out.println(i);
}
public static Integer testReturn(){
try {
int i = 8/0;
System.out.println("執(zhí)行try中代碼!");
return 1;
} catch (Exception e) {
System.out.println("執(zhí)行catch中代碼!");
return 0;
}
finally {
System.out.println("執(zhí)行finally中代碼!");
return 3;
}
}
執(zhí)行結果

如果再finally終止程序運行,則丟失返回值
public static void main(String[] args) {
Integer i= testReturn();
System.out.println(i);
}
public static Integer testReturn(){
try {
int i = 8/0;
System.out.println("執(zhí)行try中代碼!");
return 1;
} catch (Exception e) {
System.out.println("執(zhí)行catch中代碼!");
return 0;
}
finally {
System.out.println("執(zhí)行finally中代碼!");
System.exit(0); //退出程序,返回值丟失
}
}
執(zhí)行結果如下圖:

沒有輸出返回值
返回類型是對象類型時值的變化
返回類型如果是對象類型,則返回的是指針。此時如果finally中包含對象的炒作,注意返回值的變化。示例代碼如下
創(chuàng)建一個Person的類
public class Person {
private String name;
private String adress;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", adress='" + adress + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAdress() {
return adress;
}
public void setAdress(String adress) {
this.adress = adress;
}
}
含有return的測試代碼如下
public static void main(String[] args) {
Person person = testObjReturn();
System.out.println(person.toString());
}
public static Person testObjReturn(){
Person person = new Person();
try {
int i = 8/0;
person.setName("王小二");
person.setAdress("電子街1號");
return person;
} catch (Exception e) {
person.setName("朱小三");
person.setAdress("電子街1號");
return person;
}
finally {
person.setName("李老五");;
}
}
執(zhí)行結果

結論
try catch finally帶有return語句時,既可以將return語句放到try和catch中,也可以放到過程的結尾,一般建議放到結尾,便于統(tǒng)一管理。特別注意finally包含return語句時try、catch中的return將不再執(zhí)行。尤其當返回的變量是實體對象時,finally中的語句如果對返回的變量進行修改,則將影響到返回值。
以上就是java異常處理執(zhí)行順序詳解try catch finally的詳細內容,更多關于java異常try catch finally執(zhí)行順序的資料請關注腳本之家其它相關文章!
相關文章
SpringBoot使用 druid 連接池來優(yōu)化分頁語句
這篇文章主要介紹了SpringBoot使用 druid 連接池來優(yōu)化分頁語句,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11

