1.8 finally和return的执行顺序
在 Java 的異常處理中,try、catch 和 finally 是按順序執(zhí)行的。
- 如果 try 中沒有異常,則順序?yàn)?try→finally,
- 如果 try 中有異常,則順序?yàn)?try→catch→finally。
但是當(dāng) try、catch、finally 中加入 return 之后,return 和 finally 的執(zhí)行順序讓很多人混淆不清。下面來(lái)分別說明一下。
1. try 和 catch 中帶有 return
1)try 中帶有 return,先是finally,再是try里的return
public class tryDemo {public static int show() {try {return 1;} finally {System.out.println("執(zhí)行finally模塊");}}public static void main(String args[]) {System.out.println(show());} }輸出結(jié)果如下:
執(zhí)行finally模塊 12)try 和 catch 中都帶有 return ,先是finally,再是catch
public class tryDemo {public static int show() {try {int a = 8 / 0;return 1;} catch (Exception e) {return 2;} finally {System.out.println("執(zhí)行finally模塊");}}public static void main(String args[]) {System.out.println(show());} }輸出結(jié)果為:
執(zhí)行finally模塊 2當(dāng) try 代碼塊或者 catch 代碼塊中有 return 時(shí),finally 中的代碼總會(huì)被執(zhí)行,且 finally 語(yǔ)句 return 返回之前執(zhí)行
2. finally 中帶有 return**,先是finally,再是finally的return
public class tryDemo {public static int show() {try {int a = 8 / 0;return 1;} catch (Exception e) {return 2;} finally {System.out.println("執(zhí)行finally模塊");return 0;}}public static void main(String args[]) {System.out.println(show());} }輸出結(jié)果如下:
執(zhí)行finally模塊 0當(dāng) finally 有返回值時(shí),會(huì)直接返回該值,不會(huì)去返回 try 代碼塊或者 catch 代碼塊中的返回值
注意:finally 代碼塊中最好不要包含 return 語(yǔ)句,否則程序會(huì)提前退出。
3. finally 中改變返回值
下面先來(lái)看 try 代碼塊或者 catch 代碼塊中的返回值是普通變量時(shí),代碼如下:
返回finally,return的result的值不變
輸出結(jié)果為:
執(zhí)行finally模塊 0由輸出結(jié)果可以看出,在 finally 代碼塊中改變返回值并不會(huì)改變最后返回的內(nèi)容。
當(dāng)返回值類型是引用類型時(shí),結(jié)果也是一樣的,代碼如下:
public class tryDemo {public static Object show() {Object obj = new Object();try {return obj;} finally {System.out.println("執(zhí)行finally模塊");obj = null;}}public static void main(String args[]) {System.out.println(show());} }輸出結(jié)果為:
執(zhí)行finally模塊 java.lang.Object@15db9742當(dāng) try 代碼塊或 catch 代碼塊中的 return 返回值類型為普通變量或引用變量時(shí),即使在后面 finally 代碼塊中對(duì)返回值的變量重新賦值,也不會(huì)影響最后返回的值。
總結(jié)為以下幾條:
- 當(dāng) try 代碼塊和 catch 代碼塊中有 return 語(yǔ)句時(shí),finally 仍然會(huì)被執(zhí)行。
- 執(zhí)行 try 代碼塊或 catch 代碼塊中的 return 語(yǔ)句之前,都會(huì)先執(zhí)行 finally 語(yǔ)句。
- 無(wú)論在 finally 代碼塊中是否修改返回值,返回值都不會(huì)改變,仍然是執(zhí)行 finally 代碼塊之前的值。
- finally 代碼塊中的 return 語(yǔ)句一定會(huì)執(zhí)行。
總結(jié)
以上是生活随笔為你收集整理的1.8 finally和return的执行顺序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.7 Java try catch f
- 下一篇: 1.10 throws和throw:声