對方不想和你說話,並向你拋出了個異常。
- 2020 年 4 月 10 日
- 筆記
Java—異常
Java.lang.Throwable
|—-Exception:程式可以處理的異常
|—-Error:與虛擬機相關問題,系統崩潰,虛擬機問題,記憶體不足,記憶體堆棧溢出……建議程式停止。
異常:程式在運行時出現不正常情況,java對不正常情況進行描述後的對象體現。
————————————————-
常見的處理方法:
|—String getMessage();
|—String toString()
|—void printStackTrace();
(jvm默認的異常處理機制其實就是調用printStackTrace());
————————————————-
異常的處理:
try { …}
catch(異常類 變數 ) { //處理幾個異常就聲明幾個catch
…
(多個catch塊中的異常出現繼承關係時,父類catch塊要放在子類catch下面)
}finally{ …}//非必須,但聲明後一定會執行,一般用於釋放資源
Eg:資料庫異常時無法關閉資料庫,可使用finally,對資源的關閉
例外:System.exit(0)系統退出,jvm結束,finally不執行。
————————————————
異常的聲明(throws)
編寫Demo時,程式碼可能發生異常
通過throws聲明功能可能會出現的異常:
Eg: int div(int a ,int b)throws Exception{
Return a/b;//我們知道b=0時會拋出ArithmeticException;
}
public static voidmain(String [] args){
try{ …} catch(Exception e){ …}
}
(catch 處理時,最好要有具體的處理形式,例如異常日誌文件等)
————————————-
自定義異常:
項目中會出現持有的問題,而這些問題並未被java所描述並封裝對象時,可將這些問題進行自定義的異常封裝(自定義類繼承異常類)
繼承異常的原因:
因為異常類和異常對象都被拋出,他們都具備可拋性,這個可拋性是Throwable體系特點,只有這個體系中的類和對象才可以被throws和throw操作
——————————
假設:a/b中,除數如果是負數和0都認為是錯的異常描述。
class IException extendsException{
//可重寫Exception方法;
//定義構造方法;//與普通類繼承基類相似構造;
父類把異常資訊操作完成了,子類只要在構造時用super(message)傳遞資訊給父類,即可調用父類方法(getMessage())
}
class Demo{
int div(int a,int b)throwsIException{
if(b<=0)
throw new IException();// 函數內throw 異常,在函數上要
//聲明或者在內部處理
return a/b;
}
}
——————–
throw和throws的區別:
throws使用在函數上,throw使用在函數內,throws後跟若干個異常類,逗號隔開,throw後跟異常對象。
———————————
異常
|—-編譯時被檢測的異常
|—-編譯時不被檢測,運行時異常(RuntimeException以及其子類)
RuntimeException:
特點:函數內拋出,函數上可不聲明,編譯通過(不需要讓調用者處理,當異常發生,希望程式停止,希望停止程式後,由程式設計師對程式碼進行驗證)
若在函數上聲明,調用者可不處理,編譯通過。
心得:如果希望某異常發生時程式停止,就讓自定義異常繼承RuntimeException
———————————–
異常在父類覆蓋中的體現:
- 1. 子類在覆蓋父類時,如果父類的方法拋出異常,那子類的覆蓋方法,只能拋出父類的異常或該異常的子類:
class AException extends Exception{
…}
class BException extends AException{
…}
class CException extends Exception{
…}
class Fu {
voidshow()throws AException{…}
}
Class Zi extends Fu{
Voidshow()throws AException ,BException{//不能聲明CException}
}
(如果子類真發生其他異常,只能try處理,不能拋出)
——————————
- 2. 如果父類方法拋出多個異常時,那麼子類在覆蓋方法時,只能拋出父類異常的子集,即父類若拋出AException,BException,則子類可拋出其中之一或兩個。
- 3. 如果父類或者介面的方法中無異常拋出,子類在覆蓋方法時,不可以拋出異常,只能處理。