java try catch_Java捕获异常
大家好,歡迎來到樂字節(jié)小樂的Java技術(shù)分享園地
在Java中,凡是可能拋出異常的語句,都可以用try ... catch捕獲。把可能發(fā)生異常的語句放在try { ... }中,然后使用catch捕獲對應(yīng)的Exception及其子類。
多catch語句
可以使用多個catch語句,每個catch分別捕獲對應(yīng)的Exception及其子類。JVM在捕獲到異常后,會從上到下匹配catch語句,匹配到某個catch后,執(zhí)行catch代碼塊,然后不再繼續(xù)匹配。
簡單地說就是:多個catch語句只有一個能被執(zhí)行。例如:
public static void main(String[] args) {try {process1();process2();process3();} catch (IOException e) {System.out.println(e);} catch (NumberFormatException e) {System.out.println(e);} }存在多個catch的時候,catch的順序非常重要:子類必須寫在前面。例如:
public static void main(String[] args) {try {process1();process2();process3();} catch (IOException e) {System.out.println("IO error");} catch (UnsupportedEncodingException e) { // 永遠捕獲不到System.out.println("Bad encoding");} }對于上面的代碼,UnsupportedEncodingException異常是永遠捕獲不到的,因為它是IOException的子類。當(dāng)拋出UnsupportedEncodingException異常時,會被catch (IOException e) { ... }捕獲并執(zhí)行。
因此,正確的寫法是把子類放到前面:
public static void main(String[] args) {try {process1();process2();process3();} catch (UnsupportedEncodingException e) {System.out.println("Bad encoding");} catch (IOException e) {System.out.println("IO error");} }finally語句
無論是否有異常發(fā)生,如果我們都希望執(zhí)行一些語句,例如清理工作,怎么寫?
可以把執(zhí)行語句寫若干遍:正常執(zhí)行的放到try中,每個catch再寫一遍。例如:
public static void main(String[] args) {try {process1();process2();process3();System.out.println("END");} catch (UnsupportedEncodingException e) {System.out.println("Bad encoding");System.out.println("END");} catch (IOException e) {System.out.println("IO error");System.out.println("END");} }上述代碼無論是否發(fā)生異常,都會執(zhí)行System.out.println("END");這條語句。
那么如何消除這些重復(fù)的代碼?Java的try ... catch機制還提供了finally語句,finally語句塊保證有無錯誤都會執(zhí)行。上述代碼可以改寫如下:
public static void main(String[] args) {try {process1();process2();process3();} catch (UnsupportedEncodingException e) {System.out.println("Bad encoding");} catch (IOException e) {System.out.println("IO error");} finally {System.out.println("END");} }注意finally有幾個特點:
如果沒有發(fā)生異常,就正常執(zhí)行try { ... }語句塊,然后執(zhí)行finally。如果發(fā)生了異常,就中斷執(zhí)行try { ... }語句塊,然后跳轉(zhuǎn)執(zhí)行匹配的catch語句塊,最后執(zhí)行finally。
可見,finally是用來保證一些代碼必須執(zhí)行的。
某些情況下,可以沒有catch,只使用try ... finally結(jié)構(gòu)。例如:
void process(String file) throws IOException {try {...} finally {System.out.println("END");} }因為方法聲明了可能拋出的異常,所以可以不寫catch。
捕獲多種異常
如果某些異常的處理邏輯相同,但是異常本身不存在繼承關(guān)系,那么就得編寫多條catch子句:
public static void main(String[] args) {try {process1();process2();process3();} catch (IOException e) {System.out.println("Bad input");} catch (NumberFormatException e) {System.out.println("Bad input");} catch (Exception e) {System.out.println("Unknown error");} }因為處理IOException和NumberFormatException的代碼是相同的,所以我們可以把它兩用|合并到一起:
public static void main(String[] args) {try {process1();process2();process3();} catch (IOException | NumberFormatException e) { // IOException或NumberFormatExceptionSystem.out.println("Bad input");} catch (Exception e) {System.out.println("Unknown error");} }練習(xí)
用try ... catch捕獲異常并處理。
下載練習(xí):捕獲異常練習(xí) (推薦使用IDE練習(xí)插件快速下載)
小結(jié)
使用try ... catch ... finally時:
- 多個catch語句的匹配順序非常重要,子類必須放在前面;
- finally語句保證了有無異常都會執(zhí)行,它是可選的;
- 一個catch語句也可以匹配多個非繼承關(guān)系的異常。
- 關(guān)注樂字節(jié),這里有更多更好的Java干貨知識
總結(jié)
以上是生活随笔為你收集整理的java try catch_Java捕获异常的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “扳龙不待翼”上一句是什么
- 下一篇: 上饶治不孕不育最好的医院推荐