Java異常,以及finally不會執行的情況


(一)java是什么?(能回答:what    where、  why 這三個問題)

            Java異常是Java提供的一種識別及響應錯誤的一致性機制。

            好處:  使程序中異常處理代碼和正常業務代碼分離,保證程序代碼更加優雅,並提高程序健壯性

(二)Java異常常用的關鍵字:  try  , catch  ,finally  ,throw  ,throws .以及各自的功能:

           (1)• try        -- 用於監聽。將要被監聽的代碼(可能拋出異常的代碼)放在try語句塊之內,當try語句塊內發生異常時,異常就被拋出。
           • catch   -- 用於捕獲異常。catch用來捕獲try語句塊中發生的異常。
           • finally  -- finally語句塊總是會被執行。它主要用於回收在try塊里打開的物力資源(如數據庫連接、網絡連接和磁盤文件)。只有finally塊,執行完成之后,才會回來執行try或者catch塊中的return或者throw語句,如果finally中使用了return或者throw等終止方法的語句,則就不會跳回執行,直接停止。
           • throw   -- 用於拋出異常
          • throws -- 用在方法簽名中,用於聲明該方法可能拋出的異常

           (2)finally不會執行的情況:

                      1)在finally語句塊中發生了異常。
                      2)在前面的代碼中用了System.exit()退出程序。
                      3)程序所在的線程死亡
                      4)關閉CPU

(三)Java異常的框架: 

       

1. Throwable
  Throwable是 Java 語言中所有錯誤或異常的超類。
  Throwable包含兩個子類Error 和 Exception。它們通常用於指示發生了異常情況。
  Throwable包含了其線程創建時線程執行堆棧的快照,它提供了printStackTrace()等接口用於獲取堆棧跟蹤數據等信息。

2. Exception
  Exception及其子類是 Throwable 的一種形式,它指出了合理的應用程序想要捕獲的條件。

3. RuntimeException 
  RuntimeException是那些可能在 Java 虛擬機正常運行期間拋出的異常的超類。
  編譯器不會檢查RuntimeException異常。例如,除數為零時,拋出ArithmeticException異常。RuntimeException是ArithmeticException的超類。當代碼發生除數為零的情況時,倘若既"沒有通過throws聲明拋出ArithmeticException異常",也"沒有通過try...catch...處理該異常",也能通過編譯。這就是我們所說的"編譯器不會檢查RuntimeException異常"!
  如果代碼會產生RuntimeException異常,則需要通過修改代碼進行避免。例如,若會發生除數為零的情況,則需要通過代碼避免該情況的發生!

4. Error
  和Exception一樣,Error也是Throwable的子類。它用於指示合理的應用程序不應該試圖捕獲的嚴重問題,大多數這樣的錯誤都是異常條件。
  和RuntimeException一樣,編譯器也不會檢查Error。

(四)Java將可拋出(Throwable)的結構分為三種類型:被檢查的異常(Checked Exception),運行時異常(RuntimeException)和錯誤(Error)。

(1) 運行時異常
定義: RuntimeException及其子類都被稱為運行時異常
特點: Java編譯器不會檢查它。也就是說,當程序中可能出現這類異常時,倘若既"沒有通過throws聲明拋出它",也"沒有用try-catch語句捕獲它",還是會編譯通過。例如,除數為零時產生的ArithmeticException異常,數組越界時產生的IndexOutOfBoundsException異常,fail-fail機制產生的ConcurrentModificationException異常等,都屬於運行時異常。
  雖然Java編譯器不會檢查運行時異常,但是我們也可以通過throws進行聲明拋出,也可以通過try-catch對它進行捕獲處理。
  如果產生運行時異常,則需要通過修改代碼來進行避免。例如,若會發生除數為零的情況,則需要通過代碼避免該情況的發生!

(2) 被檢查的異常
定義Exception類本身,以及Exception的子類中除了"運行時異常"之外的其它子類都屬於被檢查異常。
特點: Java編譯器會檢查它。此類異常,要么通過throws進行聲明拋出,要么通過try-catch進行捕獲處理,否則不能通過編譯。例如,CloneNotSupportedException就屬於被檢查異常。當通過clone()接口去克隆一個對象,而該對象對應的類沒有實現Cloneable接口,就會拋出CloneNotSupportedException異常。
  被檢查異常通常都是可以恢復的。

 

 

(3) 錯誤
定義: Error類及其子類。
特點: 和運行時異常一樣,編譯器也不會對錯誤進行檢查。
  當資源不足、約束失敗、或是其它程序無法繼續運行的條件發生時,就產生錯誤。程序本身無法修復這些錯誤的。例如,VirtualMachineError就屬於錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM