1. 程式人生 > >關於JAVA項目中的常用的異常處理情況

關於JAVA項目中的常用的異常處理情況

finally java 異常處理 及其 mem java fbo 這樣的 否則 oerr

程序運行時,發生的不被期望的事件,它阻止了程序按照程序員的預期正常執行,這就是異常。 在出現異常時,可能會出現錯誤提示詞為Throwable,Error, AWTError,IOError, LinkageErro,ThreadDeath,Exception,SQLException, IOException ,RuntimeException,IndexOutOfBoundsException,NullPointerException, ClassCastException。Throwable中包含有兩個重要的子類:Exception(異常)和 Error(錯誤),二者都是 Java 異常處理的重要子類,各自都包含大量子類。error表示系統或虛擬機的異常,無法捕獲,例如OutOfMemoryError。Exception表示 程序本身可以處理的異常。RuntimeException表示JVM 常用操作引發的異常。Checked表示在編譯期間就可以發現的異常,必須在運行之前就進行處理的異常,除了RuntimeException及其子類以外,其他的Exception類及其子類都屬於可查異常。這種異常的特點是Java編譯器會檢查它,也就是說,當程序中可能出現這類異常,要麽用try-catch語句捕獲它, 要麽用throws子句聲明拋出它,否則編譯不會通過。Unchecked表示包括運行時異常和錯誤。運行時異常表示運行時異常的特點是Java編譯器不會檢查它,也就是說,當程序中可能出現這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會編譯通過。編譯異常表示是RuntimeException以外的異常,類型上都屬於Exception類及其子類。從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。

異常是在執行某個函數時引發的,而函數又是層級調用,形成調用棧的,因為,只要一個函數發生了異常,那麽他的所有的caller都會被異常影響。當這些被影響的函數以異常信息輸出時,就形成的了異常追蹤棧。異常最先發生的地方,叫做異常拋出點。總體上我們根據Javac對異常的處理要求,將異常類分為2類。第一類時非檢查異常,Error 和 RuntimeException 以及他們的子類,對於這些異常,我們應該修正代碼,而不是去通過異常處理器處理 。這樣的異常發生的原因多半是代碼寫的有問題。第二類異常是,檢查異常,除了Error 和 RuntimeException的其它異常,這樣的異常一般是由程序的運行環境導致的。因為程序可能被運行在各種未知的環境下,而程序員無法幹預用戶如何使用他編寫的程序,於是程序員就應該為這樣的異常時刻準備著。以上就是我通過課上ppt以及百度了解到的有關異常的相關知識,出現異常的時候會出現的提示詞,以及異常的相關種類。

我們還需要掌握如何防止異常的出現,以及異常出現時該如何修復。Java提供了更加優秀的解決辦法:異常處理機制。異常處理機制能讓程序在異常發生時,按照代碼的預先設定的異常處理邏輯,針對性地處理異常,讓程序盡最大可能恢復正常並繼續執行,且保持代碼的清晰。Java中的異常可以是函數中的語句執行時引發的,也可以是程序員通過throw 語句手動拋出的,只要在Java程序中產生了異常,就會用一個對應類型的異常對象來封裝異常,JRE就會試圖尋找異常處理程序來處理異常。Throwable類是Java異常類型的頂層父類,一個對象只有是 Throwable 類的(直接或者間接)實例,他才是一個異常對象,才能被異常處理機制識別。JDK中內建了一些常用的異常類,我們也可以自定義異常。在編寫代碼處理異常時,對於檢查異常,有2種不同的處理方式:第一種是使用try…catch…finally語句塊處理它。在try語句塊中放可能出現異常的代碼,如果執行完try之後不發生異常,則執行finally塊和finally塊後面的代碼,如果發生異常,則嘗試匹配catch塊。catch塊,每一個catch塊用於捕獲並處理一個特定的異常,或者這異常類型的子類,Java7中可以將多個異常聲明在一個catch中。catch後面的括號定義了異常類型和異常參數。如果異常與之匹配且是最先匹配到的,則虛擬機將使用這個catch塊來處理異常。在catch塊中可以使用這個塊的異常參數來獲取異常的相關信息。異常參數是這個catch塊中的局部變量,其它塊不能訪問。如果當前try塊中發生的異常在後續的所有catch中都沒捕獲到,則先去執行finally,然後到這個函數的外部caller中去匹配異常處理器。如果try中沒有發生異常,則所有的catch塊將被忽略。finally塊,finally塊通常是可選的,無論異常是否發生,異常是否匹配被處理,finally都會執行,一個try至少要有一個catch塊,否則, 至少要有1個finally塊。但是finally不是用來處理異常的,finally不會捕獲異常,finally主要做一些清理工作,如流的關閉,數據庫連接的關閉等。上課的老師說到一種問題,就是既然try可以檢測異常,那可不可以把所有的代碼都放進try裏,這樣可以更可以保證代碼的正確性,但是這樣也是有代價的,如果這個代碼可以承受住這種代價,那麽應該也是可以的,但是這種一般不建議使用。另外,try塊中的局部變量和catch塊中的局部變量(包括異常變量),以及finally中的局部變量,他們之間不可共享使用。每一個catch塊用於處理一個異常。異常匹配是按照catch塊的順序從上往下尋找的,只有第一個匹配的catch會得到執行。匹配時,不僅運行精確匹配,也支持父類匹配,因此,如果同一個try塊下的多個catch異常類型有父子關系,應該將子類異常放在前面,父類異常放在後面,這樣保證每個catch塊都有存在的意義。java中,異常處理的任務就是將執行控制流從異常發生的地方轉移到能夠處理這種異常的地方去。也就是說:當一個函數的某條語句發生異常時,這條語句的後面的語句不會再執行,它失去了焦點。執行流跳轉到最近的匹配的異常處理catch代碼塊去執行,異常被處理完後,執行流會接著在“處理了這個異常的catch代碼塊”後面接著執行,有的編程語言當異常被處理後,控制流會恢復到異常拋出點接著執行,而Java則是讓執行流恢復到處理了異常的catch塊後接著執行。finally塊沒有處理異常的能力。處理異常的只能是catch塊。在同一try…catch…finally塊中 ,如果try中拋出異常,且有匹配的catch塊,則先執行catch塊,再執行finally塊。如果沒有catch塊匹配,則先執行finally,然後去外面的調用者中尋找合適的catch塊。在同一try…catch…finally塊中 ,try發生異常,且匹配的catch塊中處理異常時也拋出異常,那麽後面的finally也會執行:首先執行finally塊,然後去外圍調用者中尋找合適的catch塊。第二種對於異常處理的方式為,在函數簽名中使用throws 聲明交給函數調用者caller去解決。throws聲明:如果一個方法內部的代碼會拋出檢查異常(checked exception),而方法自己又沒有完全處理掉,則javac保證你必須在方法的簽名上使用throws關鍵字聲明這些可能拋出的異常,否則編譯不通過。throws是另一種處理異常的方式,它不同於try…catch…finally,throws僅僅是將函數中可能出現的異常向調用者聲明,而自己則不具體處理。采取這種異常處理的原因可能是:方法本身不知道如何處理這樣的異常,或者說讓調用者處理更好,調用者需要為可能發生的異常負責。throw 語句必須寫在函數中,執行throw 語句的地方就是一個異常拋出點,它和由JRE自動形成的異常拋出點沒有任何差別。以上就是我通過查閱資料了解到的異常的種類,異常出現的時候出現的異常表現,以及異常的預防方式和異常的修復方法。



關於JAVA項目中的常用的異常處理情況