溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java異常處理的示例分析

發(fā)布時間:2021-11-20 15:28:40 來源:億速云 閱讀:146 作者:柒染 欄目:大數(shù)據(jù)

Java異常處理的示例分析,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

Throwable類是Java語言所有錯誤或異常的超類(兩個直接子類:Error和Exception)

Java異常處理的示例分析

Error vs Exception

Java程序在執(zhí)行過程中所發(fā)生的異常事件可分為兩類:

Error:Error類對象由Java虛擬機生成并拋出,大多數(shù)錯誤與代碼編寫者所執(zhí)行的操作無關(guān)。例如,Java虛擬機運行錯誤(Virtual MachineError),當(dāng)JVM不再有繼續(xù)執(zhí)行操作所需的內(nèi)存資源時,將出現(xiàn)OutOfMemoryError。這些異常發(fā)生時,Java虛擬機(JVM)一般會選擇線程終止;還有發(fā)生在虛擬機試圖執(zhí)行應(yīng)用時,如類定義錯誤(NoClassDefFoundError)、鏈接錯誤(LinkageError)。這些錯誤是不可查的,因為它們在應(yīng)用程序的控制和處理能力之外,而且絕大多數(shù)是程序運行時不允許出現(xiàn)的狀況。對于設(shè)計合理的應(yīng)用程序來說,即使確實發(fā)生了錯誤,本質(zhì)上也不應(yīng)該試圖去處理它所引起的異常狀況。在Java中,錯誤通常是使用Error的子類描述。
Exception:在Exception分支中有一個重要的子類RuntimeException(運行時異常),該類型的異常自動為你所編寫的程序定義ArrayIndexOutOfBoundsException(數(shù)組下標(biāo)越界)、NullPointerException(空指針異常)、ArithmeticException(算術(shù)異常)、MissingResourceException(丟失資源)、ClassNotFoundException(找不到類)等異常,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應(yīng)該從邏輯角度盡可能避免這類異常的發(fā)生;而RuntimeException之外的異常我們統(tǒng)稱為非運行時異常,類型上屬于Exception類及其子類,從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。

Error和Exception的區(qū)別:Error通常是災(zāi)難性的致命的錯誤,是程序無法控制和處理的,當(dāng)出現(xiàn)這些異常時,Java虛擬機(JVM)一般會選擇終止線程;Exception通常情況下是可以被程序處理的,并且在程序中應(yīng)該盡可能的去處理這些異常。

檢查異常vs不受檢查異常

檢查異常:在正確的程序運行過程中,很容易出現(xiàn)的、情理可容的異常狀況,在一定程度上這種異常的發(fā)生是可以預(yù)測的,并且一旦發(fā)生該種異常,就必須采取某種方式進行處理。

除了RuntimeException及其子類以外,其他的Exception類及其子類都屬于檢查異常,當(dāng)程序中可能出現(xiàn)這類異常,要么使用try-catch語句進行捕獲,要么用throws子句拋出,否則編譯無法通過。

不受檢查異常:包括RuntimeException及其子類和Error。

不受檢查異常為編譯器不要求強制處理的異常,檢查異常則是編譯器要求必須處置的異常。

異常處理關(guān)鍵字

Java異常處理涉及到五個關(guān)鍵字,分別是:try、catch、finally、throw、throws。

  • try: 用于監(jiān)聽。將要被監(jiān)聽的代碼(可能拋出異常的代碼)放在try語句塊之內(nèi),當(dāng)try語句塊內(nèi)發(fā)生異常時,異常就被拋出。

  • catch:用于捕獲異常。catch用來捕獲try語句塊中發(fā)生的異常。 —finally:finally語句塊總是會被執(zhí)行。它主要用于回收在try塊里打開的物力資源(如數(shù)據(jù)庫連接、網(wǎng)絡(luò)連接和磁盤文件)。只有finally塊,執(zhí)行完成之后,才會回來執(zhí)行try或者catch塊中的return或者throw語句,如果finally中使用了return或者throw等終止方法的語句,則就不會跳回執(zhí)行,直接停止。

  • throw:用于拋出異常。

  • throws:用在方法簽名中,用于聲明該方法可能拋出的異常。

注意:try后面如果跟多個catch,那么小范圍的異常放前面,大范圍的異常放后面(根據(jù)多態(tài)的原理,如果大的放前面,就會將所有的子類對象接收,后面的catch就沒有意義了)

常見問題

final、finally、finalize的區(qū)別

  • final 可以用來修飾類、方法、變量,分別有不同的意義,final 修飾的 class 代表不可以繼承擴展,final的變量是不可以修改的,而final的方法也是不可以重寫的(override)。

  • finally 則是Java保證重點代碼一定要被執(zhí)行的一種機制。我們可以使用 try-finally 或者 try-catch-finally 來進行類似關(guān)閉 JDBC 連接、保證 unlock 鎖等動作。

  • finalize是基礎(chǔ)類 java.lang.Object的一個方法,它的設(shè)計目的是保證對象在被垃圾收集前完成特定資源的回收。finalize 機制現(xiàn)在已經(jīng)不推薦使用,并且在 JDK 9 開始被標(biāo)記為 deprecated。

需要關(guān)閉的連接等資源時,相比finally,更推薦使用Java 7中添加的try-with-resources語句,因為通常Java平臺能夠更好地處理異常情況,編碼量也要少很多。如果確實需要額外處理,可以考慮 Java 提供的 Cleaner 機制或者其他替代方法。

如果在執(zhí)行到finally之前JVM退出了,比如System.exit(0)),則finally代碼不會執(zhí)行

如果catch里面有return語句,finally里面的代碼還會執(zhí)行嗎?

代碼示例:

class FinallyDemo {    public static void main(String[] args) {        System.out.println(getInt());    }
   public static int getInt() {        int a = 10;        try {            System.out.println(a / 0);            a = 20;        } catch (ArithmeticException e) {            a = 30;            return a;        } finally {            a = 40;            return a+1;        }//        return a;    }}

上面的實驗代碼可以解答所有問題。

  1. 如果finally沒有return的話,catch在運行return之前將會運行finally的邏輯,然后再跳轉(zhuǎn)回catch的return,輸出30。

  2. 如果finally如果有return的話,catch在運行return之前會運行finally的邏輯,然后直接運行finally的return,輸出41。

異常注意事項

  1. 子類不能拋出父類沒有的異常。子類拋出的的異常與父類拋出的異常相同或者是父類拋出的異常的子類

  2. 如果父類中被重寫的方法沒有異常拋出,那么子類的方法絕對不可以拋出異常。如果子類中有異常發(fā)生,那么子類只能try,不能throws

看完上述內(nèi)容,你們掌握J(rèn)ava異常處理的示例分析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI