天天看點

Java異常與處理機制

Java異常與處理機制

Java的異常層次體系

Java的所有異常對象都派生自Throwable類,下層有兩個分支:error和exception。

Error分支描述Java運作時系統内部錯誤或資源耗盡錯誤,遇到派生自Error的錯誤,程式除了通告給使用者并盡量安全退出外也無能為力。

Exception分支才是程式員主要在意的異常,它又分為RuntimeException和IOException兩個分支。

RuntimeException通常是由于程式錯誤導緻的。

IOException通常程式本身沒有問題,但由于像I/O錯誤等問題導緻的。

Java規範将Error分支和RuntimeException分支的異常稱為非受查異常,其他異常稱為受查異常。

抛出異常

程式員在編寫代碼時若遇到無法處理的情況(受查異常),可以選擇抛出異常,将問題交給程式的調用者解決。

在方法名後用throws語句聲明異常告訴調用者代碼會抛出什麼異常,若需抛出多個異常時就必須列出所有的異常類用逗号隔開。一個方法必須聲明所有肯抛出的受查異常。例如:

public void read()throws FileNotFoundException,EOFException

在方法中使用throw語句抛出異常,例如:

throw new IOException();

捕獲異常

抛出異常是一種異常的解決方案,但不是最終方案。如果異常沒有得到處理程式就會崩潰終止,是以需要捕獲異常。Java提供了try/catch語句捕獲異常。

如果try語句中發生了異常,則停止執行try塊中的代碼轉而執行catch塊中的代碼,捕獲讀個異常時需為每個異常提供catch語句處理且catch語句自上到下要與異常繼承鍊相同由子到父,還可以合并catch語句用‘|’合并捕獲多個異常。

複制代碼

try {

code

} catch (FileNotFoundException | UnknownHostException e) {

exception handler           

} catch (IOException e){

exception handler           

}

finally語句:若程式出現異常時,就會終止方法中剩餘的代碼并退出方法。如果方法獲得了一些資源并且隻有方法自己知道,就會産生資源回收問題。Java提出finally子句的解決方案,不管異常如何處理,finally子句一定會被執行。

處理異常時的幾種代碼執行順序:

try{

code1
code that might throw exceptions
code2           

}catch(Exception e){

code3
code that might throw exceptions
code4           

}finally{

code5           

code6

try塊代碼無異常,執行順序為1,2,5,6

try塊代碼中出現異常,catch語句中沒有出現異常,執行順序為1,3,4,5,6

try塊代碼中出現異常,catch語句中也出現異常,執行順序為1,3,5

帶資源的try語句

對于實作了AutoCloseable或Closeable接口的資源,Java提供了帶資源的try語句,當try塊退出時,資源自動調用close()方法。

帶資源的try語句(try-with-resources)的形式為:

try(Resource res = ...){

// code work with res           

AutoCloseable接口有一個close方法,它抛出一個Exception異常

void close() throws Exception;

Closeable接口繼承自AutoCloseable接口 也有一個close方法,它抛出一個IOException異常

public void close() throws IOException;

斷言

在檢查受查異常時,通常會使用大量輸出語句進行測試,這些語句在測試完畢後依然會留在程式中,如果程式中留有這些大量的檢查語句會導緻程式運作變慢。

在jdk1.4中引入了斷言機制,它允許在開發和測試階段在代碼中插入一些檢查語句檢測異常。由于Java虛拟機預設斷言是關閉的,是以在項目釋出後不影響程式的運作。

斷言的使用

assert 條件;

assert 條件:表達式;

當條件結果為false時,抛出AssertionError異常,在第二種形式中表達式會傳入AssertionError類的構造器中形成一個消息字元串。

在測試中使用-enableassertions或-ea開啟斷言。

舉個栗子:

Scanner in = new Scanner(System.in);

int x = in.nextInt();

assert x>0:x;

double y = Math.sqrt(x);

原文位址

https://www.cnblogs.com/LeoCoding/p/11220381.html