java學習——異常處理,java異常處理

來源:互聯網
上載者:User

java學習——異常處理,java異常處理

    使用 Java 語言進行軟體開發與測試指令碼開發時不容忽視的一個問題就是異常處。是否進行異常處理直接關係到開發出的軟體的穩定性和健壯性。
異常

異常指不期而至的各種狀況,如:檔案找不到、網路連接失敗、非法參數等。異常是一個事件,它發生在程式運行期間,幹擾了正常的指令流程。

Java通過API中Throwable類的眾多子類描述各種不同的異常。因而,Java異常都是對象,是Throwable子類的執行個體,描述了出現在一段編碼中的錯誤條件。當條件產生時,錯誤將引發異常。

分類

在 Java 中,所有的異常都有一個共同的祖先 Throwable(可拋出)。Throwable 指定代碼中可用異常傳播機制通過 Java應用程式傳輸的任何問題的共性。

  • Throwable:

有兩個重要的子類:Exception(異常)和 Error(錯誤),二者都是 Java 異常處理的重要子類,各自都包含大量子類。

  • Error(是程式無法處理的錯誤)

表示運行應用程式中較嚴重問題。大多數錯誤與代碼編寫者執行的操作無關,而表示代碼運行時 JVM(Java虛擬機器)出現的問題。例如,Java虛擬機器運行錯誤(Virtual MachineError),當 JVM不再有繼續執行操作所需的記憶體資源時,將出現 OutOfMemoryError。這些異常發生時,Java虛擬機器(JVM)一般會選擇線程終止。

這些錯誤是不可查的,因為它們在應用程式的控制和處理能力之外,而且絕大多數是程式運行時不允許出現的狀況。對於設計合理的應用程式來說,即使確實發生了錯誤,本質上也不應該試圖去處理它所引起的異常狀況。在Java中,錯誤通過Error的子類描述。

  • Exception(是程式本身可以處理的異常)

Exception 這種異常分兩大類運行時異常和非運行時異常(編譯異常)。程式中應當儘可能去處理這些異常。

 1. 運行時異常

都是RuntimeException類及其子類異常,如NullPointerException(null 指標異常)、IndexOutOfBoundsException(下標越界異常)等,這些異常是不檢查異常,程式中可以選擇捕獲處理,也可以不處理。這些異常一般是由程式邏輯錯誤引起的,程式應該從邏輯角度儘可能避免這類異常的發生。

行時異常的特點是Java編譯器不會檢查它,也就是說,當程式中可能出現這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會編譯通過。

     2. 非運行時異常 (編譯異常)

是RuntimeException以外的異常,類型上都屬於Exception類及其子類。從程式文法角度講是必須進行處理的異常,如果不處理,程式就不能編譯通過。如IOException、SQLException等以及使用者自訂的Exception異常,一般情況下不自訂檢查異常。

Java 異常處理的原則
  • 儘可能的處理異常

要儘可能的處理異常,如果條件確實不允許,無法在自己的代碼中完成處理,就考慮聲明異常。如果人為避免在代碼中處理異常,僅作聲明,則是一種錯誤和依賴的實踐。

  • 具體問題具體解決

異常的部分優點在於能為不同類型的問題提供不同的處理操作。有效異常處理的關鍵是識別特定故障情境,並開發解決此情境的特定相應行為。為了充分利用異常處理能力,需要為特定類型的問題構建特定的處理器塊。

  • 記錄可能影響應用程式啟動並執行異常

至少要採取一些永久的方式,記錄下可能影響應用程式操作的異常。理想情況下,當然是在第一時間解決引發異常的基本問題。不過,無論採用哪種處理操作,一般總應記錄下潛在的關鍵問題。別看這個操作很簡單,但它可以協助您用很少的時間來跟蹤應用程式中複雜問題的起因。

  • 根據情形將異常轉化為業務上下文

若要通知一個應用程式特有的問題,有必要將應用程式轉換為不同形式。若用業務特定狀態表示異常,則代碼更易維護。從某種意義上講,無論何時將異常傳到不同上下文(即另一技術層),都應將異常轉換為對新上下文有意義的形式。

Java異常處理

通過5個關鍵字try、catch、throw、throws、finally進行管理。基本過程是用try語句塊包住要監視的語句,如果在try語句塊內出現異常,則異常會被拋出,你的代碼在catch語句塊中可以捕獲到這個異常並做處理;還有以部分系統產生的異常在Java運行時自動拋出。

你也可以通過throws關鍵字在方法上聲明該方法要拋出異常,然後在方法內部通過throw拋出異常對象。finally語句塊會在方法執行return之前執行,一般結構如下:

 try{  程式碼 }catch(異常類型1 異常的變數名1){  程式碼 }catch(異常類型2 異常的變數名2){  程式碼 }finally{  程式碼 }

catch語句可以有多個,用來匹配多個異常,匹配上多個中一個後,執行catch語句塊時候僅僅執行匹配上的異常。

catch的類型是Java語言中定義的或者程式員自己定義的,表示代碼拋出異常的類型,異常的變數名表示拋出異常的對象的引用,如果catch捕獲並匹配上了該異常,那麼就可以直接用這個異常變數名,此時該異常變數名指向所匹配的異常,並且在catch代碼塊中可以直接引用。這一點非常非常的特殊和重要!

總結

Java異常處理的目的是提高程式的健壯性,是Java語言的一大特色,也是個痛點,掌握異常處理可以讓寫的代碼更健壯和易於維護。而且更重要的是,java處理異常的這種思想特別值得我們學習,我們一定要有長遠的目光,具有全域觀,將未來要發生的錯誤扼殺在搖籃之中。當然,冰凍三尺非一日之寒,我們還需要更加努力的學習。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.