在Java程序運行時,經常會出現一些非正常的現象,這種狀況稱爲運行錯誤。根據其性質能夠分爲錯誤和異常。java
Java程序中全部拋出的異常都必須從Throwable派生而來。類Throwable有兩個直接子類:Error和Exception.程序員
通常來講,最多見的錯誤有程序進入死循環、內存泄露等。這種狀況下,程序運行時自己沒法解決問題,只能經過其餘程序干預。Java對應的類爲Error類。Error類對象由Java虛擬機生成並拋棄(一般Java程序不對這類異常進行處理)。算法
異常是程序執行時遇到的非正常狀況或意外行爲。如下這些狀況通常均可以引起異常;代碼或調用的代碼中有錯誤,操做系統資源不可用,公共語言運行庫遇到意外狀況。常見的有數組下標越界、算法溢出、除數爲零、無效參數、內存溢出等。這種狀況不像錯誤那樣,程序運行時自己能夠解決,由異常代碼調整程序運行方向,使程序仍可繼續運行,直至運行結束。編程
Java異常對應的類爲Exception類。Exception類對象是Java程序處理或者拋棄的對象,它有各類不一樣的子類分別對應與不一樣類型的異常。Java編譯器要求程序必須捕獲或聲明全部的非運行時異常,但對於運行時異常能夠不作處理。其中類RuntimeException表明運行時由Java虛擬機生成的異常,緣由是編程錯誤。其餘則爲非運行時異常,緣由是程序碰到了意外狀況,如輸入\輸出異常IOException等。數組
Java異常處理的關鍵語句有五個:try、catch、throw、throws、finally。其中try、catch、finally三個語句塊應注意的問題以下。函數
1.try、catch、finally三個語句均不能單獨使用,三者能夠組合,try---catch---finally、try---catch、try---finally三種結構,catch語句能夠有一個或者多個,finally語句最多一個。操作系統
2.try、catch、finally三個代碼塊中變量的做用域爲代碼塊內部,分別獨立而不能相互訪問。若是要在三個塊中均可以訪問,則須要將變量定義到這些塊的外面。對象
3.如有多個catch塊,只會匹配其中一個異常類並執行catch塊代碼,而不會執行再執行別的catch塊,而且匹配catch語句的順序是由上到下的。內存
4.throw關鍵字用於方法體內部,用來拋出一個Throwable類型的異常。若是拋出了檢查異常,則還應該在頭部聲明方法可能拋出的異常類型。該方法的調用者必須檢查拋出的異常。若是全部的方法都層層上拋獲取的異常,最終JVM會進行處理會進行處理,就是打印異常消息和堆棧信息。若是拋出的Error或RuntimeException,則該方法的調用者可選擇處理該異常。資源
5.thorws關鍵字用於方法體外部的方法聲明部分,用來聲明方法可能會拋出某些異常。僅當拋出了檢查異常,該方法的調用者才必須處理或者從新拋出該異常。當方法的調用者無力處理該異常的時候,應該繼續拋出,而不是囫圇吞棗地打印堆棧信息來處理。
1.過於龐大的try塊
某些程序把大量的代碼塊放入當個try塊,試圖用一個catch語句捕獲全部的異常和處理全部可能出現的異常,實際上這是一個壞習慣。緣由就在於爲了圖省事,不肯花時間分析一大塊代碼中哪幾行會拋出異常、異常的具體類型是什麼。把大量的語句裝入單個巨大的try塊就像是出門旅遊時把所有家當塞入集裝箱帶走,雖然東西帶上了,但要找出來可不容易。
對於這種問題,能夠設置多個異常拋出點來解決。異常對象從產生點產生後,到被捕捉後終止生命的全過程當中,其實是一個傳值的過程,因此,應根據實際來合理控制異常個數。catch語句表示會出現某種異常,並且但願可以處理該異常。因此語句中就應該儘可能具體異常類型,也可使用多個catch,用於分別處理不一樣的異常。
2.異常的完整性
在Java語言中,若是一個函數運行時可能會向上層調用者函數拋出一個異常,那麼,他就必須在該函數的聲明中顯示地註明(採用throws關鍵字)。不然編譯器會拋出錯誤信息「must be caught or declared to be thrown」,其中「must be caught」指在Java的異常處理模型中,要求全部被拋出的異常都必須有對應的「異常處理模塊」。若是你在程序中利用throw出現一個異常,那麼在你的程序中,就必需要用catch處理這個異常。
3.RuntimeException異常
在Java異常處理中,通常有兩類異常:其一,就是經過throw語句,程序員在代碼中人爲的拋出的異常;另一個是系統運行時異常,例如:被零除,空字符串,無效句柄等,對於這類異常,程序員實際上徹底能夠避免它,只要咱們寫代碼時足夠當心嚴謹。由於,爲了完全解決這種隱患,提升程序總體可靠性,使用RuntimeException異常就是爲了實現這樣的功能。
針對RuntimeException類型的異常,javac是沒法經過編譯的靜態語法檢測來判斷到底哪些函數可能拋出這類異常,也這由於如此,Java異常處理模型中「must be caught or declared to be thrown」規則也不適用於次。固然RuntimeException也能夠被程序顯示地拋出,並且爲了程序的可靠性,對一些可能出現的運行時異常的代碼區域,程序員最好可以及時的處理這些異常。