多線程知識點目錄
多線程并發(1)- http://www.lxweimin.com/p/8fcfcac74033
多線程并發(2)-http://www.lxweimin.com/p/a0c5095ad103
多線程并發(3)-http://www.lxweimin.com/p/c5c3bbd42c35
多線程并發(4)-http://www.lxweimin.com/p/e45807a9853e
多線程并發(5)-http://www.lxweimin.com/p/5217588d82ba
多線程并發(6)-http://www.lxweimin.com/p/d7c888a9c03c
一、異常處理機制
當一個方法遇到錯誤或無法完成任務時,它會拋出一個異常。這個異常可以是檢查型異常(例如在嘗試讀取一個不存在的文件時),也可以是非檢查型異常(例如空指針異常)。
當一個異常被拋出時,當前方法的執行會立即停止,控制權會傳遞給最近的、能夠處理該異常的代碼塊。這個代碼塊可能是在當前方法外部的代碼,也可能是同一個方法中的另一個try-catch塊。
另外,調用這個方法的其他代碼也無法繼續執行,異常處理機制會將代碼執行交給異常處理器。
使用異常處理機制可以使程序更加健壯,能夠處理并適當地響應在運行過程中可能出現的各種錯誤情況。良好的異常處理可以使程序更易于理解和維護,同時還可以提供更詳細的錯誤信息,有助于調試和解決問題。
二、異常分類
Throwable是Java語言中所有錯誤或異常的超類。其子類為:
Error
和Exception
。
2.1 Error
是指Java運行時系統內部錯誤和資源耗盡錯誤。應用程序不會拋出該對象。如果出現了這樣的錯誤,除了告知用戶,剩下的就是盡力使程序安全的終止。
2.2 Exception
異常有兩個分支,一個是運行時異常RuntimeException
,一個是檢查異常CheckedException
。
2.2.1 RuntimeException
代表了一組在運行時可能會出現的異常情況。RuntimeException
類本身是所有運行時異常的基類,其子類代表了各種具體的運行時異常情況。例如空指針訪問、數組越界等。這些錯誤通常是由于程序員的疏忽或錯誤導致的,而不是由于外部環境或不可預知的情況引起的。因此,Java編譯器不會強制程序員顯式地處理這些異常,而是在運行時拋出異常,由程序員自行處理。當一個RuntimeException
被拋出時,當前方法的執行會立即停止,控制權會傳遞給最近的、能夠處理該異常的代碼塊。如果沒有找到匹配的異常處理代碼塊,程序會終止。因此,在編寫Java代碼時,程序員應該盡可能地避免出現RuntimeException
,以確保程序的穩定性和健壯性。
常見的RuntimeException
及其含義:
- NullPointerException:當一個應用程序試圖在需要對象的地方使用null時拋出。例如,調用一個空對象的實例變量或方法。
- IndexOutOfBoundsException:當索引超出范圍時拋出,例如訪問數組或字符串時。
- ArithmeticException:當出現異常的算術條件時拋出,例如除以零或浮點溢出。
- IllegalArgumentException:當向方法傳遞了一個不合法或不正確的參數時拋出。
- IllegalStateException:當方法處于非法或不合適的狀態時拋出,例如關閉了一個已經關閉的流。
2.2.2 CheckedException
一般是外部錯誤,這種異常都發生在編譯階段,Java 編譯器會強制程序去捕獲此類異常,即會出現要求你把這段可能出現異常的程序進行 try catch,該類異常一般包括幾個方面:
- 試圖在文件尾部讀取數據
- 試圖打開一個錯誤格式的 URL
- 試圖根據給定的字符串查找 class 對象,而這個字符串表示的類并不存在
三、異常的處理方式
3.1 捕獲異常(try-catch)
當在try塊中發生異常時,程序的控制流立即轉移到相應的catch塊。
try {
//可能會拋出異常的代碼
int[] arr = new int[5];
arr[10] = 50; //會拋出ArrayIndexOutOfBoundsException
} catch (ArrayIndexOutOfBoundsException e) {
//處理異常
System.out.println("數組越界");
} finally {
//無論是否發生異常,這里的代碼都會執行
System.out.println("程序結束");
}
3.2 拋出異常(throw)
在Java中,可以使用throw關鍵字拋出一個異常。這必須在一個方法中完成,并且該方法必須使用throws關鍵字聲明它可能拋出的異常。
public void printOwing(double amount) throws Exception {
if (amount > 1000) {
throw new Exception("OWING too much");
} else {
System.out.println("amount: " + amount);
}
}
3.3 聲明異常(throws)
當一個方法可能會拋出一個受檢查的異常時,可以使用throws關鍵字聲明該異常。這告訴編譯器該方法可能會拋出異常,調用該方法的代碼需要進行適當的異常處理。
public void printOwing(double amount) throws Exception {
if (amount > 1000) {
throw new Exception("OWING too much");
} else {
System.out.println("amount: " + amount);
}
}
3.4 throw
和throws
的區別
位置不同
-
throws
用在函數上,后面跟的是異常類,可以跟多個;而throw
用在函數內,后面跟的是異常對象。
功能不同
-
throws
用來聲明異常,讓調用者只知道該功能可能出現的問題,可以給出預先的處理方式;throw
拋出具體的問題對象,執行到throw
,功能就已經結束了,跳轉到調用者,并將具體的問題對象拋給調用者。也就是說throw
語句獨立存在時,下面不要定義其他語句,因為執行不到。 -
throws
表示出現異常的一種可能性,并不一定會發生這些異常;throw
則是拋出了異常,執行throw
則一定拋出了某種異常對象。 - 兩者都是消極處理異常的方式,只是拋出或者可能拋出異常,但是不會由函數去處理異常,真正的處理異常由函數的上層調用處理。