摘要:JAVA 異常
異常: 程序在運行時出現不正常情況
分為兩種:
嚴重: java通過Error類別進行描述
非嚴重: java通過Exception處理
Throwable類別: 子類為Error、Exception
Exception在運行時運行出現的情況,可以通過try catch finally處理
編譯時異常: 必須throws,並讓調用者try and catch
非編譯時異常: RuntimeException及其子類
方法:
getMessage()獲取異常資訊,返回字串
toString()獲取異常類名和異常資訊,返回字串
printStackTrace()獲取異常類名和異常資訊,以及異常出現在程式中的位元置。返回值void
printStackTrace(PrintStream s)通常用該方法將異常內容保存在日誌檔中,以便查閱
異常的處理:
try{
需要檢測的代碼;
}catch(異常類 變數){
異常處理代碼; //處理方式
}finally{
一定會執行的代碼;
}
Finally代碼塊只有一種情況不會被執行。就是在之前執行了System.exit(0)。
通過構造函式定義異常資訊。
try{
int x = 4/0;
}catch(Exception e){
System.out.println(e.getMessage()); // by zero
System.out.println(e.toString()); // java.lang.ArithmeticException: / by zero
e.printStackTrace();
}
輸出:
java.lang.ArithmeticException: / by zero
at Hello.main(Hello.java:5)
throws用於標識函數暴露出的異常
ex:
int div(int a, int b) throws Exceptio
以throws說明此函數可能出現異常,必須定義補捉或聲明
throws與throw的區別:
thorws用在函數上,後面跟異常類名,可以拋出多個,以逗號區分
throw用在函數內,後面跟異常物件,用於拋出異常物件
當函數內有throw拋出異常對象,並未進行try處理時,必須要在函數上聲明,否則編譯失敗,只有RuntimeException例外。如果函數有聲明異常時,調用者需要進行處理,可以throws或try。
通過throw將自定義異常拋出。
RuntimeException以及其子類如果在函數中被throw拋出,可以不用在函數上聲明。
一個方法被覆蓋時,覆蓋它的方法必須拋出相同的異常或異常的子類。
如果父類拋出多個異常,那麼覆寫方法必須拋出那些異常的一個子集,不能拋出新的異常。
介紹異常在分層設計時的層內封裝。
自定義異常:
class A{
int div(int a, int b) throws TestException{
if(b <= 0)
throw new TestException("錯誤訊息");
return a/b;
}
}
自定義異常內容:
class TestException extends Exception{
TestException(String msg){
super(msg); //呼叫父類Exception建構子
}
}
class Hello{
public static void main(String[] args){
A a= new A();
try{
int x = a.div(1, -1);
}catch(TestException e){
e.printStackTrace();
}
}
}
class A{
int div(int a, int b){
if(b == 0)
throw new ArithmeticException("除以零");
return a/b;
}
}
class Hello{
public static void main(String[] args){
A a= new A();
int x = a.div(1, 0);
}
}
ArthmeticException為RuntimeException的子類,RuntimeException運行時異常,這種異常可以不用聲明,且調用者也不需處理,編譯後可執行。表示系統希望這類異常要直接終止,不需處理。
異常在繼承運用時:
子類拋出的異常必須是父類的異常的子類或子集
如果父類或者介面沒有異常拋出時,子類覆寫出現異常時,只能try不能拋出