Java異常及異常處理

  • 異常體系結構

一、全部異常都繼承於Throwable類,其下有兩大子類:java

(1)Error類:錯誤,通常編程人員不太接觸,如虛擬機錯誤、線程死鎖等。硬傷:使程序崩潰 ,沒辦法處理sql

(2)Exception類:異常,編碼、環境、用戶輸入等問題,其子類主要有:編程

非檢查異常(運行時異常RuntimeException):【由java虛擬機自動捕獲】

空指針NullPointer

越界ArrayIndexOutofBounds

錯誤類型轉換ClassCast

算數異常Arithmetic

等等
檢查異常CheckException:【須要手動添加捕獲和處理語句】文件IO異常、sql異常等等
  • try..catch..finally實現檢查異常處理

異常處理:
1、try-catch(多catch塊)-finally
(1)try塊:負責捕獲異常,一旦try中發現異常,程序的控制權將被移交給catch塊中的異常處理程序。【try語句塊不能夠獨立存在,必須與 catch 或者 finally 塊同存】
(2)catch塊:如何處理?好比發出警告:提示、檢查配置、網絡鏈接,記錄錯誤等。執行完catch塊以後程序跳出catch塊,繼續執行後面的代碼。
編寫catch塊的注意事項:多個catch塊處理的異常類,要按照先catch子類後catch父類的處理方式,由於會【就近處理】異常(由上自下)。
(3)finally:最終執行的代碼,用於關閉和釋放資源等
============================================================

try{
//一些會拋出檢查異常的java語句
}catch(Exception e){
//處理該異常的代碼塊
}finally{
//最終要執行的代碼
} 
System.out.println("");
若是有異常拋出,方法結束執行,異常會由系統捕獲,並交給相應的catch去處理(拋出提醒或記錄日誌等),異常代碼塊外代碼正常執行。
try會拋出不少種類型的異常,多個catch塊捕獲多鍾錯誤。
多重異常處理代碼塊順序問題:先子類再父類(順序不對也會提醒錯誤),finally語句塊處理最終將要執行的代碼
  • try...catch...finally執行順序

一、無論有木有出現異常,finally塊中代碼都會執行;
二、當try和catch中有return時,finally仍然會執行;
三、finally是在try和catch中的return後執行的(先把要返回的值保存起來,無論finally中的代碼怎麼樣,返回的值都不會改變,仍然是以前保存的值),因此函數返回值是在finally執行前肯定的;
四、finally中最好不要包含return,不然程序會提早退出,返回值不是try或catch中保存的返回值。而是finally中的值。

1.e.printStackTrace()能夠輸出異常信息
2.return -1:爲拋出異常的習慣寫法
3.若是方法中try,catch,finally中沒有返回語句,則會調用這三個語句塊以外的return結果
4.finally塊不管如何,無論前面是正常仍是異常,都要執行。
5.finally 在try中的return以後 在返回主調函數以前執行。

finally 在try中的return以後 在返回主調函數以前執行。網絡

  •  Java 中的異常拋出

兩個重要的關鍵字:throw和throws 
1.throws的異常列表標識可能拋出的異常,多是拋出一條異常,也多是拋出多條異常,每一個類型的異常中間用逗號隔開 
2.方法體中調用會拋出異常的方法或者是先拋出一個異常:用throw new Exception()
 throw寫在方法體裏,表示「拋出異常」這個動做 
3.若是某個方法調用了拋出異常的方法,那麼必須添加try catch語句去嘗試捕獲這種異常,或者添加聲明,將異常拋出給更上一層的調用者進行處理
  • 自定義異常

自定義異常: class 自定義異常類 extends 異常類型{} 上面的異常類型能夠是Exception,也能夠是其子類
  • 經驗總結

一、處理運行時異常時,採用邏輯去合理規避同時輔助try-catch處理
二、在多重catch塊後面,能夠加一個catch(Exception)來處理可能會被遺漏的異常
三、對於不肯定的代碼,也能夠加上try-catch,處理潛在的異常
四、儘可能去處理異常,切記只是簡單的調用printStackTrace()去打印
五、具體如何處理異常,要根據不一樣的業務需求和異常類型去決定
六、儘可能添加finally語句塊去釋放佔用的資源
相關文章
相關標籤/搜索