Java編程思想 學習筆記12

來源:互聯網
上載者:User

標籤:定義   元素   new   相同   環境   處理   覆蓋   方法   ret   

十二、通過異常處理錯誤 

Java的基本理念是“結構不佳的代碼不能運行”。

Java中的異常處理的目的在於通過使用少於目前數量的代碼來簡化大型、可靠的程式的產生,並且通過這種方式可以使你更加自信:你的程式中沒有未處理的錯誤。

 

1.概念 

  C以及其他早期語言常常具有多種錯誤處理模式,這些模式往往建立在約定俗成的基礎上,而並不屬於語言的一部分。通常會返回某個特殊值或者設定某個標誌,並且假定接收者將對這個傳回值或標誌進行檢查,以判定是否發生了錯誤。然而,對於構造大型、健壯、可維護的程式而言,這種錯誤處理模式已經成為了主要障礙。

  解決的辦法是,用強制規定的形式來消除錯誤處理過程中隨心所欲的因素。這種做法由來已久,對異常處理的實現可以追溯到20世紀60年代的作業系統,甚至於BASIC語言中的on error goto語句。而C++的異常處理機制基於AdaJava中的異常處理則建立在C++的基礎之上。

  使用異常所帶來的一個相當明顯的好處是,它往往能夠降低錯誤處理代碼的複雜度。如果不使用異常,那麼就必須檢查特定的錯誤,並在程式中的許多地方去處理它。而如果使用異常,那就不必在方法調用處進行檢查,因為異常機制將保證能夠捕獲這個錯誤。並且,只需在一個地方處理錯誤,即所謂的例外處理常式中。這種方式不僅節省代碼,而且把“描述在正常執行過程中做什麼事”的代碼和“出了問題怎麼辦”的代碼相分離。

  

2.基本異常 

  異常情形是指阻止當前方法或範圍繼續執行的問題。把異常情形與普通問題相區分很重要,所謂的普通問題是指,在當前環境下能得到足夠的資訊,總能處理這個錯誤。而對於異常情形,就不能繼續下去了,因為在當前環境下無法獲得必要的資訊來解決問題。你所能做的就是從當前問題跳出,並且把問題提交給上一級環境。這就是拋出異常時所發生的事情。

  當拋出異常後,有幾件事會隨之發生。首先,同Java中其他對象的建立一樣,將使用new在堆上建立異常對象。然後,當前的執行路徑將終止,並且從當前環境中彈出對異常對象的引用。此時,異常處理機制接管程式,並開始尋找一個恰當的地方來繼續執行程式。這個恰當的地方就是例外處理常式,它的任務是將程式從錯誤狀態中恢複,以使程式能要麼換一種方式運行,要麼繼續運行下去。

  ①異常參數

  所有標準異常類都有兩個構造器:一個是預設構造器;另一個是接受字串作為參數,以便能把相關資訊放入異常對象的構造器。

  通常,異常對象中僅有的資訊就是異常類型,除此之外不包含任何有意義的內容。

 

3.捕獲異常 

  要明白異常是如何被捕獲的,必須首先理解監控地區的概念。它是一段可能產生異常的代碼,並且後面跟著處理這些異常的代碼。

  ①try塊

  如果在方法內部拋出了異常,這個方法將在拋出異常的過程中結束。要是不希望方法就此結束,可以在方法內設定一個特殊的塊來捕獲異常。因為在這個塊裡“嘗試”各種方法調用,所以稱為try塊。

try {     //Here‘s the code       }

  ②例外處理常式 

  例外處理常式緊跟在try塊後面,以關鍵字catch表示。

 

4.建立自訂異常 

  要自己定義異常類,必須從已有的異常類繼承,最好是選擇意思相近的異常類。

  對異常來說,最重要的部分就是類名。

 

5.異常說明 

  異常說明屬於方法聲明的一部分,緊跟在形式參數列表之後。

 

6.捕獲所有的異常 

  可以唯寫一個例外處理常式來捕獲所有類型的異常。通過捕獲異常類型的基類Exception就可以做到這一點。

  printStackTrace()方法所提供的資訊可以通過getStackTrace()方法來直接存取,這個方法將返回一個由棧軌跡中的元素所構成的數組,其中每一個元素都表示棧中的一幀。元素0是棧頂元素,並且是調用序列中的最後一個方法調用。

  異常鏈

  常常會想要在捕獲一個異常後拋出另一個異常,並且希望把原始異常的資訊儲存下去,這被稱為異常鏈。現在所有的Throwable的子類在構造器中都可以接受一個cause對象作為參數。這個cause就用來表示原始異常,這樣通過把原始異常傳遞給新的異常,使得即使在當前位置建立並拋出了新的異常,也能通過這個異常鏈追蹤到異常最初發生的位置。

  只有三種基本的異常類提供了帶cause參數的構造器,分別是ErrorExceptionRuntimeException。如果要把其他類型的異常連結起來,應該使用initCause()方法而不是構造器。

  

7.Java標準異常 

  Throwable這個類被用來表示任何可以作為異常被拋出的類。Throwable對象可分為兩種類型:Error用來表示編譯時間和系統錯誤;Exception是可以被拋出的基本類型。Java程式員關心的基底類型通常是Exception。

  異常的基本概念是用名稱代表發生的問題,並且異常的名稱應該可以望文知意。

  ①特例:RuntimeException 

  運行時異常會自動被Java虛擬機器拋出,被稱為“不受檢查異常”。

  如果RuntimeException沒有被捕獲而直達main(),那麼在程式退出前將調用異常的printStackTrace()方法。

  RuntimeException代表的是編程錯誤:

  1)無法預料的錯誤。例如null引用

  2)作為程式員,應該在代碼中進行檢查的錯誤。

 

8.使用finally進行清理 

  無論try塊中的異常是否被拋出,finally子句裡的代碼總能運行。

  當要把除記憶體之外的資源恢複到它們的初始狀態時,就要用到finally子句。這種需要清理的資源套件括:已經開啟的檔案或網路連接,在螢幕上畫的圖形,甚至可以是外部世界的某個開關。

  當涉及break和continue語句的時候,finally子句也會得到執行。

  當用某些特殊的方式使用finally子句,會出現異常丟失的情況。例如在finally子句中return。

 

9.異常的限制 

  當覆蓋方法的時候,只能拋出在基類方法的異常說明裡列出的那些異常。這意味著,當基類使用的代碼應用到其衍生類別對象的時候,一樣能夠工作,異常也不例外。

  異常限制對構造器不起作用。但衍生類別構造器的異常說明必須包含基類構造器的異常說明。衍生類別構造器不能捕獲基類構造器拋出的異常。

  不能基於異常說明來重載方法。一個出現在基類方法的異常說明中的異常,不一定會出現在衍生類別方法的異常說明中。

 

10.構造器 

  對於在構造階段可能會拋出異常,並且要求清理的類,最安全的使用方式是使用嵌套的try子句。

 

11.異常匹配 

  拋出異常的時候,異常處理系統會按照代碼的書寫順序找出“最近”的處理常式。找到匹配的處理常式之後,它就認為異常將得到處理,尋找不再繼續。

  衍生類別的對象也可以匹配其基類的處理常式。

 

12.異常使用指南 

  1)在恰當的層級處理問題。

  2)解決問題並且重新調用產生異常的方法。

  3)進行少許修補,然後繞過異常發生的地方繼續執行。

  4)用別的資料進行計算,以代替方法預計會返回的值。

  5)把當前運行環境下能做的事情盡量做完,然後把相同或不同的異常拋到更高層。

  6)終止程式。

  7)進行簡化。

  8)讓類庫和程式更安全。

 

13.總結   以上簡略了許多內容,許多更複雜一些的問題不是一言兩語。

  異常可以協助我們製造出更多健壯的程式,是相當重要又不那麼複雜的知識。應該熟練掌握

 

Java編程思想 學習筆記12

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.