1 JAVA異常
異常:阻止方法或方法域繼續執行的問題。指不期而來的各種狀況,如:文件找不到、內存越界等。異常是一個事件,發生在程序運行期間,干擾程序的正常執行。而JAVA異常Throwable類下又分為若干子類,分別處理不同狀況下所遇到的異常。下圖是java異常層次圖
Throwable:是所有異常類的祖先類。Throwable
下有兩個重要的子類Error(錯誤)
和Exception(異常)
。
Error(錯誤):是程序無法處理的錯誤,主要發生在程序運行過程中,錯誤的發生與代碼編寫者的操縱無關,是JVM運行時所出現的問題。例如:JVM運行時出錯發生VirtualMachineError
,從而導致內存資源不足,將出現OutOfMemoryError
異常,最終JVM將終止線程。
Exception(異常):是程序可以處理的異常。Exception
下有一個重要的子類RuntimeException
。RuntimeException
主要是JVM操作所引起的異常。例如:數組越界(ArrayIndexOutOfBoundException)
、空指針異常NullPointException
等。
** * 異常和錯誤的區別:異常能被程序所處理,而錯誤是不能被處理的。***
Exception主要分為編譯性異常和運行時異常。
編譯性異常:是除了
RuntimenException
之外的其它的Exception
類和其子類。編譯性異常必須需要被處理,不被處理代碼將不會被編譯通過。例如:IOException
、SQLException
或者是用戶自定的異常等。運行時異常:是
RuntimeException
類或其子類。例如:NullPointException
、IndexOutOfBoundException
等。對于運行時異常, 程序中可以選擇性處理,可以選擇處理也可以不處理,運行時異常主要是代碼邏輯所引發的異常。
2 處理異常機制
在java應用程序中,異常處理機制主要分為:拋出異常 和 捕捉異常
拋出異常:當應用程序發生錯誤引發異常時,方法將創建異常對象提交給運行時系統,異常對象主要包含異常類型和當前程序的狀態等異常信息,而運行時系統將會尋找合適的方法去處理所提交的異常。
捕獲異常:當引用程序發生異常時,運行時系統將會去尋找合適的異常處理器。潛在的異常處理器是異常發生時依次存儲在調用棧中的一個集合中。當異常處理器的異常類型和拋出的異常的類型相同時,即找到了對應的異常處理器去處理異常。若沒有找到合適的異常處理器去處理異常,程序將會終止運行。
- 捕獲異常:try-catch-finally
try{
//可能會發生異常的程序代碼
}catch(Type1id1){
//捕獲并處理try拋出的異常類型Type1
}catch(Type2id2){
//捕獲并處理try拋出的異常類型Type2
}finally{
//無論是否發生異常,都將執行的語句塊
}
try塊:用于捕獲異常,其后可以寫零或多個catch
塊,若沒有catch
塊時,其后必須要寫一個finally
塊。
catch塊:用于處理捕獲的異常。
finally塊:無論程序是否遇到異常,finally
塊都將被執行。* 若在finally
塊之前有return
語句,那么finally
塊代碼將會在return
返回前執行 *。當發生一下幾種情況時finally
塊將不會被執行。
1. 在finally
塊中出現異常。
2. 在前面的代碼中使用了System.exit(int)
退出了程序。
3. 程序所在的線程死亡。
4. CPU關閉。
- 拋出異常
任何java代碼都可以拋出異常。但是方法中都必須使用throws
拋出。
如果一個方法可能會出現異常,而這個方法卻沒有能力去處理,那么就需要使用throws
來將異常拋出。例如自行車出現故障,自行車無法處理,那么就讓騎車的任處理。throws
語句在定義方法時聲明該方法要拋出的異常類型,如果拋出的時Exception
類型,則該方法被聲明拋出所有類型的異常。當拋出多個類型異常時,中間用”,“分割。
void methodName throws Exceptio1,Exception2.....(){
}
使用throws
將會把異常拋給調用方法的調用者, 當然調用者還可以繼續往上拋出,但最后必須要有可以處理異常的調用者。
- Throwable類中常見的方法
- e.getCause():返回拋出的原因,如果cause不存在,返回null。
- e.getMessage():返回異常的信息。
- printStackTrace():錯誤的輸出流。
3 自定義異常類
java內置的異常類有的時候不能滿足用戶所有的需求,這時用戶就需要自定義異常類了,只需要繼承Exception
類。
class MyException extends Exception{
public MyException(String messagr){
super(message)
}
}