異常處理

分類

<p>異常對象對派生于Throwable類的一個實例。如果java中內(nèi)置的異常類不能夠滿足需求,用戶可以創(chuàng)建自己的異常類</p>

簡單的類關(guān)系圖

Exception簡單類關(guān)系圖.png

主要類介紹

Error

Error類層次結(jié)構(gòu)描述了Java 運行時系統(tǒng)內(nèi)部的錯誤和資源耗盡錯誤。應(yīng)用程序不應(yīng)該拋出這種類型的對象。如果出現(xiàn)這樣的內(nèi)部錯誤,除了通告給用戶,并盡力使程序安全的終止之外,再也無能為力。(即這種情況,不需要用戶處理,是系統(tǒng)處理的)

Exceptions

這個層次結(jié)構(gòu)有分解為兩個分支:一個分支派生于RuntimeExcepton,另一個分支包含其他異常。劃分兩個分支的規(guī)則是:由程序錯誤導(dǎo)致的異常屬于RunTimeException;而程序本身沒問題,但由于像I/O錯誤這類問題導(dǎo)致的異常屬于其他異常。

舉例

RuntimeException

  • 錯誤的類型轉(zhuǎn)換
  • 數(shù)組越界訪問
  • 訪問空指針

不是派生于RunTimeException 的異常包括

  • 試圖在文件尾部后面讀取數(shù)據(jù)
  • 試圖查找一個不村子的文件
  • 通過給定字符串查找Class對象,但是這個類并不存在

Java語言規(guī)范將派生于Error類或RuntimeExceptoin類的所有異常稱為(Unchecked)未檢查異常。編譯器將核查是否為所有的已檢查異常提供了異常處理

聲明已檢查異常

如果遇到了無法處理的情況,那么Java的方法可以拋出一個異常。(一個方法不僅需要告訴編譯器要返回什么值,還要告訴編譯器有可能發(fā)生什么錯誤)

方法應(yīng)該在其首部聲明所有可能拋出的異常。這樣可以從首部反映出這個方法可能拋出那類已檢查異常
例如

public void myExceptionMethod() throws Exception {}

當(dāng)然不必將所有可能拋出的異常進行聲明,至于什么時候需要在方法中用throws語句聲明異常,什么時候必須用throws語句聲明,記住下面四種情況

  • 調(diào)用一個拋出已檢查異常的方法
  • 程序運行過程中發(fā)現(xiàn)錯誤,并且利用throw語句拋出一個已檢查異常
  • 程序出現(xiàn)錯誤
  • Java虛擬機和運行時庫出現(xiàn)的內(nèi)部錯誤

一個方法必須聲明所有可能拋出的已檢查異常,而未檢查異常要么不可控制(Erro),要么就應(yīng)該避免發(fā)生(RuntimeExceptoin).如果方法沒有聲明所有可發(fā)生的已檢查異常,編譯器就會報錯

創(chuàng)建異常程序類

在程序中,可能會遇到任何標(biāo)準(zhǔn)異常類都沒有能夠充分描述清楚的問題。在這種情況下,就需要創(chuàng)建自己的異常類。即定義一個派生于Exception(或其子類)的類,定義的類應(yīng)該包含兩個構(gòu)造方法,一個默認(rèn),一個是帶有詳細(xì)信息的。
*例

class myExceptoinClass extends IOException {
   public myExceptoinClass() { }
   public myExceptoinClass(String gripe) {
      super(guride);
   }
}

捕獲異常

如果異常發(fā)生時候沒有任何地方進行捕獲,程序就會終止執(zhí)行,并在控制臺上打印輸出異常信息。

捕獲異常必須設(shè)置try/catch語句塊。

捕獲多個異常 try/catch/catch

再次拋出異常與異常鏈

finally子句

try/catch/finally,無論try語句塊中是否遇到異常,finally子句都會被執(zhí)行。

警告:當(dāng)finally中包含return語句時。假設(shè)利用return語句從try語句塊中退出。會在方法返回前,finally語句內(nèi)容會被執(zhí)行,若finally中也有return語句,則這個返回值會覆蓋原始返回值。

帶資源的try語句

會自動調(diào)用 close(),并且close()的異常會被壓制。

分析堆棧跟蹤元素

堆棧跟蹤(strack trace) 是一個方法調(diào)用過程列表,他們包含了程序執(zhí)行過程中方法調(diào)用的特定位置。當(dāng)Java程序正常終止,而沒有捕獲異常時,這個列表就會顯示出來。

小結(jié)

后面例子少了好多,時間有些不足沒寫出來,感興趣的話可以看下“Java核心技術(shù)卷一 4th”。

簡單總結(jié)下,如果分為兩類的話是,已檢查異常和未檢查異常,而已檢查異常必須做處理,否則編譯器會報錯。

內(nèi)容差很多,有時間補上。

內(nèi)容參考:Java核心技術(shù)卷一 4th

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 六種異常處理的陋習(xí) 你覺得自己是一個Java專家嗎?是否肯定自己已經(jīng)全面掌握了Java的異常處理機制?在下面這段代...
    Executing閱讀 1,357評論 0 6
  • 概念介紹 異常是發(fā)生在程序執(zhí)行過程中阻礙程序正常執(zhí)行的錯誤事件,當(dāng)一個程序出現(xiàn)錯誤時,可能的情況有如下3種: 語法...
    niaoge2016閱讀 5,215評論 2 20
  • 初識異常(Exception) 比如我們在取數(shù)組里面的某個值得時候,經(jīng)常會出現(xiàn)定義的取值范圍超過了數(shù)組的大小,那么...
    iDaniel閱讀 1,882評論 1 2
  • Java異常類型 所有異常類型都是Throwable的子類,Throwable把異常分成兩個不同分支的子類Erro...
    予別她閱讀 946評論 0 2
  • “吃好吃的東西要死,不吃也要死,無論如何都要死的話,不吃就太浪費了。”不得不承認(rèn),在看到這句話時我居然笑了,看來這...
    會飛的龍貓閱讀 809評論 5 3