異常
概述:指的是程式在執行過程中,出現的非正常的情況,最終會導緻JVM的非正常運作
注意:
- 在java等面向對象的程式設計語言中,異常本身是一個類,産生異常就是建立異常對象并抛出了一個異常對象。java處理異常的方式是中斷處理。
- 異常指的并不是文法錯誤,文法錯了,編譯不通過,不會産生位元組碼檔案,根本不能運作
異常的體系:
Throwable異常的頂層類,是java語言中所有錯誤或異常的父類
Error:嚴重錯誤Error,無法通過處理的錯誤,隻能事先避免,好比絕症
例如:記憶體洩漏,資料庫崩潰
Exception:表示異常,異常産生後程式員可以通過代碼的方式糾正,使程式繼續運作,是必須要處理的,
異常的分類:
編譯異常:在編譯期間出現的異常,編譯異常如果編譯期間不處理,是通不過編譯的
除了RuntimeException及其子類都是表示的編譯異常
運作異常:在運作期間出現的異常,運作異常如果編譯期間不處理,可以通過編譯的 RuntimeException及其子類都是表示運作異常
異常的産生過程解析:
- 建立異常對象,封裝異常的資訊
- throw抛出異常
- JVM接收異常,并發送異常到控制台,終止程式運作
java異常處理的五個關鍵字:try、catch、finally、throw、throws
throw關鍵字
概述:在java中,提供一一個throw關鍵字,它用來抛出一個指定的異常對象
格式:
throw new 異常類名(參數);
位置:
throw用在方法内,用來抛出一個異常對象,将這個異常對象傳遞到調用者處,并結束目前方法的執行
throws關鍵字
第一種處理異常的方式:聲明處理異常
聲明異常:将問題辨別出來,報告給調用者。
如果方法内通過throw抛出了編譯時異常而沒有捕獲處理,那麼必須通過throws進行聲明,讓調用者去處理
關鍵字throws運用于方法聲明 之上,用于表示目前方法不處理異常,而是提醒該方法的調用者來處理異常(抛出異常)
聲明異常格式:
修飾符 傳回值類型 方法名(參數)throws 異常類名1,異常類名2…{ }
注意事項:
- throws用于進行異常類的聲明,若該方法可能有多重異常情況産生,那麼在throws後面可以寫多個異常類,用逗号隔開
- 如果方法需要使用throws抛出多個異常來處理異常,假設這多個異常是父子類關系,那麼就可以直接抛父類異常
try…catch
捕獲異常:java中對異常有針對性的語句進行捕獲,可以堆出現的異常進行制定方式的處理
格式:
try{
編寫可能出現異常的代碼
}catch(異常的類型 變量名){
處理異常的代碼
//記錄日志/列印異常資訊/繼續抛出異常
}
注意:
- try和catch都不能單獨使用,必須連用
- 如果try中的代碼出現了異常,那麼try中出現異常位置後面的代碼就不會執行了
- 如果try中的代碼出現了異常,程式還是會繼續往下執行,如果throws抛出異常的方式處理異常,出現異常之後會終止程式的運作
- 如果try中的代碼出現了異常,那麼就會執行catch中的代碼,如果try中的代碼沒有出現異常,那麼就不會執行catch後面的代碼,不管try中是否出現異常,程式都都會繼承往下執行
Throwable類中定義了一些檢視方法
public String getMessage() :擷取異常的描述資訊,原因(提示給使用者的時候,就提示錯誤原因。
public String toString() :擷取異常的類型和異常描述資訊(不用)。
public void printStackTrace() :列印異常的跟蹤棧資訊并輸出到控制台。
多個異常使用捕獲又該如何處理呢?
- 多個異常分别處理
- 多個異常一次捕獲,多次處理
- 多個異常一次捕獲,一次處理
finally關鍵字
概述:有一些特定的代碼無論異常是否發生,都需要執行。另外,因為異常會引發程式跳轉,導緻有些語句執行 不到。而finally就是解決這個問題的,在finally代碼塊中存放的代碼都是一定會被執行的。
格式:
try{
編寫可能出現異常的代碼
}catch(異常的類型 變量名){
處理異常的代碼
//記錄日志/列印異常資訊/繼續抛出異常
}finally{
//正常情況永遠都會執 一般寫釋放資源的代碼
}
異常注意:
- 運作時異常被抛出可以不處理。即不捕獲也不聲明抛出。
- 如果父類抛出了多個異常,子類覆寫父類方法時,隻能抛出相同的異常或者是他的子集。
- 父類方法沒有抛出異常,子類覆寫父類該方法時也不可抛出異常。此時子類産生該異常,隻能捕獲處理,不能聲明抛出
- 當多異常處理時,捕獲處理,前邊的類不能是後邊類的父類
- 在try/catch後可以追加finally代碼塊,其中的代碼一定會被執行,通常用于資源回收。
- 如果finally有return語句,永遠傳回finally中的結果,避免該情況.
并行:指兩個或多個事件在同一時刻發生(同時發生)
并發:指連個或多個事件在同一個時間段内發生
線程:其實就是程序的最小可執行單元
程序:其實就是應用程式可執行單元,.exe檔案
結論:一個應用程式可以有多個程序,一個程序可以有多條線程
注意 :一個java程式就隻有一個程序,而一個程序一次隻能執行一條線程,是以在java中隻有多線程并發
線程排程:随機排程,JVM采用的是搶占式排程,沒有采用分時排程, 是以可以能造成多線程執行結果的的随機性。
多線程并行:多條線程同時執行
多線程并發:多條線程同時請求執行,但是CPU一次隻能執行一個線程,是以隻能随機交替執行,這個就是多線程并發