java的設計目的是讓程序員有機會設計一個沒有錯誤的應用程序。當應用程序與資源或用戶交互時,程序員可能會知道一些異常,這些異常是可以處理的。不幸的是,也有程序員無法控制或簡單忽略的例外情況。簡而言之,并不是所有的異常都是相同的,因此程序員需要考慮幾種類型。
異常是導致程序無法在其預期的執行中運行的事件。異常有三種類型——檢查異常、錯誤和運行時異常。
the checked exception(檢查異常)
已檢查異常是java應用程序應該能夠處理的異常。例如,如果應用程序從文件中讀取數據,它應該能夠處理filenotfoundexception。畢竟,無法保證預期的文件會出現在它應該出現的位置。文件系統上可能發生任何事情,應用程序對此一無所知。
讓我們進一步看看這個例子。假設我們使用filereader類來讀取字符文件。如果你看一看java api中的filereader構造函數定義,你會發現它的方法簽名:
1
2
|
public filereader(string filename) throws filenotfoundexception |
如您所見,構造函數明確聲明filereader構造函數可以拋出filenotfoundexception。這是有意義的,因為文件名字符串很可能會不時出錯。請看下面的代碼:
1
2
3
4
5
|
public static void main(string[] args){ filereader fileinput = null ; //打開輸入文件 fileinput = new filereader( "untitled.txt" ); } |
從語法上來說,這些語句是正確的,但是這些代碼永遠不會編譯。編譯器知道filereader構造函數可以拋出filenotfoundexception,而處理此異常則取決于調用代碼。有兩個選擇-首先,我們可以通過指定一個throw子句來傳遞異常:
1
2
3
4
5
|
public static void main(string[] args) throws filenotfoundexception{ filereader fileinput = null ; //打開輸入文件 fileinput = new filereader( "untitled.txt" ); } |
或者我們可以處理例外情況:
1
2
3
4
5
6
7
8
9
10
11
12
|
public static void main(string[] args){ filereader fileinput = null ; try { //打開輸入文件 fileinput = new filereader( "untitled.txt" ); } catch (filenotfoundexception ex) { //告訴用戶去找文件 } } |
編寫良好的java應用程序應該能夠處理檢查過的異常。
errors(錯誤)
第二種異常稱為錯誤。當異常發生時,jvm將創建一個異常對象。這些對象都派生自可拋出類。可拋出類有兩個主要子類——錯誤和異常。error類表示應用程序不太可能處理的異常。
這些例外被認為是罕見的。例如,jvm可能會因為硬件無法處理它必須處理的所有進程而耗盡資源。應用程序可以捕獲錯誤并通知用戶,但通常應用程序必須關閉,直到底層問題得到處理。
runtime exceptions(運行時異常)
發生運行時異常僅僅是因為程序員犯了錯誤。你已經寫好了代碼,編譯器會覺得一切都很好當你運行代碼時,它會崩潰,因為它試圖訪問一個不存在的數組元素或者一個邏輯錯誤導致一個方法被調用為空值。或者程序員可能犯的任何數量的錯誤。但是沒關系,我們通過詳盡的測試來發現這些異常,對吧?
錯誤和運行時異常屬于未檢查異常的類別。