好
影片3 用 try - catch 處理 Exception
影片5 throw 的應用與 Checked / Unchecked Exception
影片6 try with resources 與 catch multiple Exception
Exception
錯誤處理機制
程式執行是以方法為單位,在某一個方法的執行過程中。若發生錯誤,Java 會將該錯誤的相關訊息包裝在 Exception 物件當中。並把這個
Exception 物件,丟回給產生錯誤的方法。
為什麼發生錯誤?
l 程式碼的不完善造成錯誤。
l 應用程式無法控制的因素。例如:資料庫無法存取、硬碟發生故障。
Exception 的 Type
l 錯誤處理機制的最上層類別是 java.lang.Throwable。
l 錯誤處理機制主要的類別是繼承自 Throwable 的 Error 與 Exception。
l Error 與它的子類別,用來呈現關於 JVM 的問題,一般而言是無法回復的。而且程式設計師,也沒有辦法針對那一種錯誤做太多的處理。
l Exception 與它的子類別,用來呈現程式碼的問題。程式設計師必須針對各種 Exception 進行處理或宣告丟出。
處理 Exception
l try-catch
n 將程式碼置於 try 區塊中。
n 用 catch 宣告要捕捉的 Exception 並撰寫對應程式碼。
n try 區塊的程式碼若產生 Exception,會中斷 try
的執行。而宣告捕捉 Exception 的 catch 區塊會執行。
n catch 可以一個以上。
n try 區塊的程式碼若產生 Exception,但是都沒有 catch 區塊可以捕捉,會中斷程式的執行。
n 一個以上的 catch 宣告捕捉不同的 Exception 時,必須先宣告子類別。
n try 區塊的程式碼若沒有產生 Exception,所有 catch
區塊都不會執行。
l finally
n try 區塊執行過程都沒有產生 exception。會在 try
區塊執行完成後執行。
n try 區塊執行過程中產生 exception。會在對應的 catch 區塊執行完後執行。
n try 區塊執行過程中產生 exception。但是沒有對應的 catch 區塊可以執行。在中斷前執行。
n try 區塊或 catch 區塊中有 return 敘述。會在
return 前執行。
丟出 Exception
l throws
在方法參數列後面。宣告本方法會丟出的
Exception 類別。
l throw
在方法本體中。指定要丟出的 Exception物件。
Checked and Unchecked
l Checked
編譯器會檢查的 exception。若方法中的程式碼會產生 Checked exception,將造成編譯錯誤。
l Unchecked
編譯器不會檢查的 exception。即使方法中的程式碼會產生 Unchecked exception,也不會造成編譯錯誤。
try with resource
l try(resource; resource; …)
n 在 try 後面的小括號中宣告並指派 resources 物件。
n Resource 物件可以一個以上用 ’;’ 隔開。
n 所有在小括號中建立的 resources 會在 try 區塊執行完畢時。依照建立的反向順序自動關閉。
n 避免為了關閉 resources 撰寫冗長的 finally。
l auto closable
n 任何類別 implements java.lang.AutoCloseable。都可以作為 resources。應用在try with resource。
l After JDK 9
n 如果 resources 是指派給 final 或實際上 final 的變數。就可以直接使用在Try with resource。
Catch multiple Exceptions
l 若有多個 catch 區塊中,要執行的程式碼是一樣的。可以在 catch 的小括號中,用分隔線隔開,宣告一個以上的
exception,來避免程式碼重複。
l 使用分隔線隔開的多個 exception,不可以有上下層類別的關係。
Custom Exception
l Java允許設計師依照需求自行開發Exception。
n Checked
繼承 Exception。
n Unchecked
繼承 RuntimeException。
Assertion
讓你可以在一個方法中,用 assert 來註記與驗證你的假設與內部邏輯。
l assert statement:
n assert booleanExpression;
assert 右邊的值如果是 false。會丟出
AssertionError 中斷程式的執行。
n assert booleanExpression : expression;
assert 右邊的值如果是 false。會丟出
AssertionError 中斷程式的執行,並列印‘:’右邊的值。
l Assertion 的檢查,預設是關閉的。要啟動 Assertion 的檢查,必須在命令列下參數。
n java -ea MyProgram
n java -enableassertions MyProgram
l 不適當的使用。
n 不要使用 assertion 檢查 public 方法的參數。
n 不要在 assert 的敘述中呼叫產生邊際效應的方法。