Day25---學習Java第二彈
2021-08-04
異常方法
下面的列表是 Throwable 類的主要方法:
1 public String getMessage()
返回關於發生的異常的詳細資訊。這個訊息在Throwable 類的建構函式中初始化了。
2 public Throwable getCause()
返回一個Throwable 物件代表異常原因。
3 public String toString()
使用getMessage()的結果返回類的串級名字。
4 public void printStackTrace()
列印toString()結果和棧層次到System.err,即錯誤輸出流。
5 public StackTraceElement [] getStackTrace()
返回一個包含堆疊層次的陣列。下標為0的元素代表棧頂,最後一個元素代表方法呼叫堆疊的棧底。
6 public Throwable fillInStackTrace()
用當前的呼叫棧層次填充Throwable 物件棧層次,新增到棧層次任何先前資訊中。
三、異常的使用及執行流程
1、異常的處理方案
try...catch、try...catch...finally、try...finally
try{
可能會發生的異常
}catch(異常型別 異常名(變數)){
針對異常進行處理的程式碼
}catch(異常型別 異常名(變數)){
針對異常進行處理的程式碼
}...
[finally{
釋放資原始碼;
}]
注意:
catch 不能獨立於 try 存在。
catch裡面不能沒有內容
在 try/catch 後面新增 finally 塊並非強制性要求的。
try 程式碼後不能既沒 catch 塊也沒 finally 塊。
try裡面越少越好。
try, catch, finally 塊之間不能新增任何程式碼。
finally裡面的程式碼最終一定會執行(除了JVM退出)
如果程式可能存在多個異常,需要多個catch進行捕獲。
異常如果是同級關係,catch誰前誰後沒有關係
如果異常之間存在上下級關係,上級需要放在後面
2、異常的執行流程
Error與Exception的區別:
Error(錯誤)是系統中的錯誤,程式設計師是不能改變的和處理的,是在程式編譯時出現的錯誤,只能通過修改程式才能修正。
一般是指與虛擬機器相關的問題,如系統崩潰,虛擬機器錯誤,記憶體空間不足,方法呼叫棧溢等。
對於這類錯誤的導致的應用程式中斷,僅靠程式本身無法恢復和和預防,遇到這樣的錯誤,建議讓程式終止。
Exception(異常)表示程式可以處理的異常,可以捕獲且可能恢復。遇到這類異常,應該儘可能處理異常,使程式恢復執行,而不應該隨意終止異常。
在catch捕獲異常時,為什麼不考慮使用Throwable型別,而只是使用Exception來進行接收?
Throwable表示的範圍要比Exception大。實際上程式使用Throwable來進行處理,沒有任何語法問題,
但是卻會存在邏輯問題。因為此時出現的(或者說使用者能夠處理的)只有Exception型別,而如果使用Throwable接收,
還會表示可以處理Error的錯誤,而使用者是處理不了Error錯誤的,所以在開發中使用者可以處理的異常都要求以Exception類為主。
異常是一起處理好還是分開處理好?
根據實際的開發要求是否嚴格來決定。在實際的專案開發專案工作中,所有的異常是統一使用Exception處理還是分開處理,
完全根據開發者的專案開發標準來決定。如果專案開發環境嚴謹,基本上要求針對每一種異常分別進行處理,
並且要詳細記錄下異常產生的時間以及產生的位置,這樣可以方便程式維護人員進行程式碼的維護。
再次注意:處理多個異常時,捕獲範圍小的異常要放在捕獲範圍大的異常之前處理。
throw和throws的區別?
throw和throws都是在異常處理中使用的關鍵字,區別如下:
throw:指的是在方法中人為丟擲一個異常物件(這個異常物件可能是自己例項化或者丟擲已存在的);
throws:在方法的宣告上使用,表示此方法在呼叫時必須處理異常。
檢查型異常(Checked Exception)與非檢查型異常(Unchecked Exception)區別?
所有的檢查性異常都繼承自java.lang.Exception;
所有的非檢查性異常都繼承自java.lang.RuntimeEx ception。
檢查性異常和非檢查性異常最主要的區別在於其處理異常的方式:檢查性異常必須使用try catch或者throws等關鍵字進行處理,
否則編譯器會報錯;非檢查性異常一般是程式程式碼寫的不夠嚴謹而導致的問題,可以通過修改程式碼來規避。
常見的執行時異常:空指標異常(NullPointerException)、除零異常(ArithmeticException)、陣列越界異常(ArrayIndexOutOfBoundsException)等;
常見的檢查性異常:輸入輸出異常(IOException)、檔案不存在異常(FileNotFoundException)、SQL語句異常(SQLException)等。
assert關鍵字(瞭解)
在Java中,assert關鍵字是從JAVA SE 1.4 引入的,為了避免和老版本的Java程式碼中使用了assert關鍵字導致錯誤,
Java在執行的時候預設是不啟動斷言檢查的(這個時候,所有的斷言語句都 將忽略!),如果要開啟斷言檢查,則需要用開關-enableassertions或-ea來開啟。
assert關鍵字語法很簡單,有兩種用法:
assert <boolean表示式>
如果<boolean表示式>為true,則程式繼續執行。
如果為false,則程式丟擲AssertionError,並終止執行。
assert <boolean表示式> : <錯誤資訊表示式>
如果<boolean表示式>為true,則程式繼續執行。
如果為false,則程式丟擲java.lang.AssertionError,並輸入<錯誤資訊表示式>。
例:
1 public class Test { 2 public static void main(String[] args) { 3 int a = 10; 4 int b = 2; 5 assert a == 10:"a不等於10"; 6 System.out.println("a="+a); 7 } 8 }
例:
1 public class Test { 2 public static void main(String[] args) { 3 int a = 10; 4 int b = 2; 5 assert a == 20:"a不等於20"; 6 System.out.println("a="+a); 7 } 8 }