异常、线程入门
目錄
?
一、異常
1.什么是異常
2.異常的繼承體系
3.異常類中常用的三個方法
4.異常的分類
二、異常處理
1.拋出異常關鍵字throw
2.Objects類中提供的非空判斷方法(*********)
3.遇到異常的兩種處理方式
4.catch代碼塊中三種常見的處理方式
5.多個異常如何獲取處理
6.finally代碼塊
7.異常的注意事項
三、自定義異常
1.自定義異常的步驟
2.自定義異常的練習
四、多線程
1.并行和并發
2.進程和線程
一、異常
1.什么是異常
指的是程序在執行過程中,出現的非正常的情況,最終會導致JVM的非正常停止。
在Java等面向對象的編程語言中,異常本身是一個類,產生異常就是創建異常對象并拋出了一個異常對象。Java處理異常的方式是中斷處理。
2.異常的繼承體系
Throwable體系:
Error:嚴重錯誤Error,無法通過處理的錯誤,只能事先避免,好比絕癥。
Exception:表示異常,異常產生后程序員可以通過代碼的方式糾正,使程序繼續運行, 是必須要處理的。好比感冒、闌尾炎。
3.異常類中常用的三個方法
public void printStackTrace()?:打印異常的詳細信息。包含了異常的類型,異常的原因,還包 括異常出現的位置,在開發和調試階段,都得使用 printStackTrace。
?
public String getMessage()?:獲取發生異常的原因。提示給用戶的時候,就提示錯誤原因。
?
public String toString()?:獲取異常的類型和異常描述信息(不用)。
4.異常的分類
(1)編譯時異常
在編譯時期,就會檢查,如果沒有處理異常,則編譯失敗。(如日期格式化異常)
(2)運行時異常
在運行時期,檢查異常.在編譯時期,運行異常不會編譯器檢測(不報錯)。(如數學異常)
二、異常處理
1.拋出異常關鍵字throw
語法:throw new 異常類名(參數);
2.Objects類中提供的非空判斷方法(*********)
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException()??;
return obj;
}
每個方法?只要參數是引用類型,一定要進行非空判斷
3.遇到異常的兩種處理方式
(1)throws拋出異常
修飾符 返回值類型 方法名(參數) throws 異常類名1,異常類名2…{ }
(2)try...catch捕獲異常
try{
編寫可能會出現異常的代碼
}catch(異常類型 e){
處理異常的代碼
//記錄日志/打印異常信息/繼續拋出異常
}
4.catch代碼塊中三種常見的處理方式
(1)記錄日志(log4j)
(2)打印異常信息
(3)繼續拋出異常
5.多個異常如何獲取處理
(1)多個異常分別處理。
(2)多個異常一次捕獲,多次處理。
(3)多個異常一次捕獲一次處理。
try{
編寫可能會出現異常的代碼
}catch(異常類型A e){ 當try中出現A類型異常,就用該catch來捕獲.
處理異常的代碼
//記錄日志/打印異常信息/繼續拋出異常
}catch(異常類型B e){ 當try中出現B類型異常,就用該catch來捕獲.
處理異常的代碼
//記錄日志/打印異常信息/繼續拋出異常
}
注意:這種異常處理方式,要求多個catch中的異常不能相同,并且若catch中的多個異常之間有子父類異常的關系,那么子類異常要求在上面的catch處理,父類異常在下面的catch處理。
6.finally代碼塊
try...catch....finally:自身需要處理異常,最終還得關閉資源。
當只有在try或者catch中調用退出JVM的相關方法,此時finally才不會執行,否則finally永遠會執行。 比如System.exit(0);
7.異常的注意事項
(1)運行時異常被拋出可以不處理。即不捕獲也不聲明拋出。
(2)如果父類拋出了多個異常,子類覆蓋父類方法時,只能拋出相同的異常或者是他的子集。(比如:如果父類拋出5個異常,子類? ? ? ? ? ? ? ? ? ? ? 只能拋出0-5個和父類相同的異常)
(3)父類方法沒有拋出異常,子類覆蓋父類該方法時也不可拋出異常。此時子類產生該異常,只能捕獲處理,不能聲明拋出
(4)當多異常處理時,捕獲處理,前邊的類不能是后邊類的父類
(5)在try/catch后可以追加finally代碼塊,其中的代碼一定會被執行,通常用于資源回收。
(6)如果finally有return語句,永遠返回finally中的結果,避免該情況.
三、自定義異常
1.自定義異常的步驟
(1) 自定義一個編譯期異常: 自定義類 并繼承于java.lang.Exception 。
(2)自定義運行時期的異常類:自定義類 并繼承于java.lang.RuntimeException 。
(3)必須有兩個構造方法。(無參構造和String參數構造)
2.自定義異常的練習
public class MyException extends Exception {
????public MyException() {
????}
????public MyException(String message) {
????????super(message);
????}
}
四、多線程
1.并行和并發
并行:兩個事件在同一時刻同時進行
并發:兩個事件在同一時間段內同時進行
2.進程和線程
進程:正在運行的程序
線程:完成進程中的某個任務
?
進程和線程之間的一些區別:
進程擁有獨立的棧和堆
線程擁有獨立的的棧和共享堆
?
線程調度
單核CPU,同一時刻,只能執行一個線程
CPU在多個線程之間進行快速切換
調度的兩種方式:
(1)分時調度:平均分配時間片 所有線程輪流使用CPU
(2)搶占式調度:CPU在多個線程之間隨機切換
Java采用搶占式調度
Java進程中默認至少有兩條線程,main線程和垃圾回收線程。
總結
- 上一篇: Java常见的面试题(一)
- 下一篇: 线程、同步