Java講課筆記18:異常處理
文章目錄
零、本講學習目標
1、理解什么是異常
2、熟悉異常的類型
3、掌握try…catch和finally異常處理
4、掌握throws關鍵字
一、什么是異常
1、程序異常及解決方法
(1)生活中的異常
(2)程序中的異常
(3)程序異常解決方法
2、Java異常體系結構
(1)Exception —— 異常
(2)Error —— 錯誤
3、Throwable類中的常用方法
二、異常的類型
1、編譯時異常
(1)編譯時異常定義
(2)編譯時異常類匯總
(3)編譯時異常的特點
(4)處理編譯時異常的方式
2、運行時異常
(1)運行時異常定義
(2)運行時異常類匯總
(3)運行時異常的特點
(4)運行時異常錯誤分析
(5)運行時異常示例
a. 數組下標越界異常
b. 空指針異常
c. 算術異常
d. 類型轉換異常
e. 數字格式異常
三、異常捕獲
1、異常捕獲try…catch語句
(1)語法格式
(2)案例演示
(3)簡要說明
2、異常捕獲try…catch...finally語句
(1)語法格式
(2)案例演示
(3)簡要說明
3、捕獲多個異常
(1)錯誤:大異常在小異常之前
(2)正確:小異常在大異常之前
四、拋出異常
1、為什么要拋出異常
2、使用throws關鍵字拋出異常
(1)語法格式
(2)案例演示
(3)簡要說明
五、課后作業
任務、給排序靜態方法拋出異常
零、本講學習目標
1、理解什么是異常
2、熟悉異常的類型
3、掌握try…catch和finally異常處理
4、掌握throws關鍵字
一、什么是異常
1、程序異常及解決方法
(1)生活中的異常
在學習、工作與生活中,我們也經常會遇到一些非正常情況,例如電腦藍屏、死機,感冒發燒,車票丟失等等。
(2)程序中的異常
在程序運行的過程中,也會發生這種非正常狀況,例如程序運行時磁盤空間不足、網絡連接中斷、被加載的類不存在等。
在《Java講課筆記08:數組》里,我們遇到過數組下標越界異常:
異常提示信息非常明確,指出程序中出現了數組下標越界異常。由于程序中第11行給不存在的數組元素scores[4]賦值,導致錯誤。這個異常發生后,程序會立即結束,無法繼續向下執行,比如第12行的輸出語句就沒有被執行。
(3)程序異常解決方法
針對程序中的非正常情況,Java語言中引入了異常,以異常類的形式對這些非正常情況進行封裝,并通過異常處理機制對程序運行時發生的各種問題進行處理。
2、Java異常體系結構
Thorwable類(表示可拋出)是所有異常和錯誤的超類,兩個直接子類為Error和Exception,分別表示錯誤和異常。
(1)Exception —— 異常
Exception稱為異常類,它表示程序本身可以處理的錯誤。在Java程序開發中進行的異常處理,都是針對Exception類及其子類的。
(2)Error —— 錯誤
Error稱為錯誤,表示Java運行時產生的系統內部錯誤或資源耗盡的錯誤,是比較嚴重的,僅靠修改程序本身是不能恢復執行的,例如系統崩潰,虛擬機錯誤等。
3、Throwable類中的常用方法
利用IntelliJ IDEA查看Throwable類的結構
Throwable類中的常用方法
二、異常的類型
1、編譯時異常
(1)編譯時異常定義
在程序編譯時期產生的異常,而這些異常必須要進行處理,也稱為checked異常。
(2)編譯時異常類匯總
在Exception的子類中,除了RuntimeException類及其子類外,其他子類都是編譯時異常。比如IOException(EOFException、FileNotFoundException)、SQLException。
(3)編譯時異常的特點
在程序編寫過程中,Java編譯器就會對編寫的代碼進行檢查,如果出現比較明顯的異常就必須對異常進行處理,否則程序無法通過編譯。
(4)處理編譯時異常的方式
使用try…catch語句對異常進行捕獲處理
使用throws關鍵字聲明拋出異常,讓調用者處理
2、運行時異常
(1)運行時異常定義
這種異常即使不編寫異常處理代碼,依然可以通過編譯,也稱為unchecked異常。
(2)運行時異常類匯總
RuntimeException類及其子類都是運行時異常。
Java常見運行時異常類
(3)運行時異常的特點
運行時異常是在程序運行時由Java虛擬機自動進行捕獲處理的,即使沒有使用try…catch語句捕獲或使用throws關鍵字聲明拋出,程序也能編譯通過,只是在運行過程中可能報錯。
(4)運行時異常錯誤分析
運行時異常一般是由于程序中的邏輯錯誤引起的,在程序運行時無法恢復。
(5)運行時異常示例
三、異常捕獲
當程序發生異常時,會立即終止,無法繼續向下執行。為了保證程序能夠有效的執行,Java中提供了一種對異常進行處理的方式——異常捕獲。
1、異常捕獲try…catch語句
(1)語法格式
try { // 可能發生異常的語句 } catch(Exception類或其子類 e){ // 對捕獲的異常進行相應處理 }
1
2
3
4
5
(2)案例演示
創建Example1806
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
運行程序,查看結果
如果除數n不為0,程序運行正常,輸出除法的結果:
如果除數n為0,程序拋出異常后終止,無法輸出除法的結果:
修改divide()方法,對可能導致異常的代碼進行異常處理
public static int divide(int m, int n) { try { int q = m / n; return q; } catch (Exception e) { // 捕獲異常進行處理 System.err.println("異常信息:" + e.getMessage()); } return Integer.MIN_VALUE; // 程序異常時返回最小整數 }
1
2
3
4
5
6
7
8
9
修改main()方法,對調用方法返回結果進行判斷
public static void main(String[] args) { int m, n, q; Scanner sc = new Scanner(System.in); System.out.print("m = "); m = sc.nextInt(); System.out.print("n = "); n = sc.nextInt(); q = divide(m, n); if (q == Integer.MIN_VALUE) { System.err.println("程序發生了異常!"); } else { System.out.println(m + " ÷ " + n + " = " + q); } System.out.println("程序到此執行完畢!"); }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
運行程序,查看結果
雖然程序發生了異常,但是程序的最后一條語句也是執行了的。
(3)簡要說明
在定義的整數除法運算方法divide()中對可能發生異常的代碼用try…catch語句進行了捕獲處理。在try{}代碼塊中發生除0異常,程序會轉而執行catch(){}中的代碼,通過調用Exception對象e的getMessage()方法,即可返回異常信息:“/ by zero”。catch(){}代碼塊對異常處理完畢后,程序仍會向下執行,執行return Integer.MIN_VALUE;,而不會因為異常而終止運行。
需要注意的是,在try{}代碼塊中,發生異常語句后面的代碼是不會被執行的,比如發生異常的語句“int q = m / n;”后面的返回語句“return q;”就沒有執行。
在程序中,如果希望有些語句無論程序是否發生異常都要執行,這時就可以在try…catch語句后,加一個finally{}代碼塊。
2、異常捕獲try…catch…finally語句
(1)語法格式
try { // 可能發生異常的語句 } catch(Exception類或其子類 e){ // 對捕獲的異常進行相應處理 } finally { // 無論是否發生異常,此代碼塊代碼總會執行 }
1
2
3
4
5
6
7
(2)案例演示
修改Example1806里的divide()方法,添加finally{}代碼塊
運行程序,查看結果
(3)簡要說明
由此可見,無論程序是否發生了異常,finally{}代碼塊里的語句都會被執行。正是由于這種特殊性,在程序設計時,經常會在try…catch后面使用finally{}代碼塊來完成善后工作,比如釋放系統資源、關閉數據庫連接、關閉線程池等。
如果在try…catch中執行了System.exit(0)語句,finally{}中的代碼就不會被執行。因為System.exit(0)語句表示退出當前的Java虛擬機,既然Java虛擬機都停止了,當然任何代碼都不能再執行了。
由于在catch{}代碼塊里添加了一條System.exit(0)語句,于是finally{}代碼塊里的語句就沒有被執行,輸出信息里就沒有“無論程序是否異常,都會執行~”了。
3、捕獲多個異常
如果有多個異常要處理,一般是先處理小異常,再依次處理較大的異常。
(1)錯誤:大異常在小異常之前
鼠標移到小異常上面,系統會提示“該異常已被捕獲”。
(2)正確:小異常在大異常之前
四、拋出異常
1、為什么要拋出異常
一般在程序開發中,開發者通常會意識到程序可能出現的問題,可以直接通過try…catch對異常進行捕獲處理。但有些時候,方法中代碼是否會出現異常,開發者并不明確或者并不急于處理,為此,Java允許將這種異常從當前方法中拋出,然后讓后續的調用者在使用時再進行異常處理。
2、使用throws關鍵字拋出異常
在Java中,將異常拋出需要使用throws關鍵字來實現,該關鍵字用在會拋出異常的方法名稱后,同時支持一次性拋出多種類型的異常。
(1)語法格式
[修飾符] 返回值類型 方法名([參數類型 參數名1...]) throws 異常類1, 異常類2, ... { // 方法體... }
1
2
3
throws關鍵字需要寫在方法聲明的后面,并在后面需要聲明方法中發生異常的類型。
(2)案例演示
創建Example1807
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
但是,程序編譯報錯,有未被處理的異常:
將鼠標移到紅色波浪線上,按組合鍵
解決方法一:Surround with try/catch 表示在出現異常的代碼處使用try…catch代碼塊進行捕獲處理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
運行程序,結果如下:
解決方法二:Add exception to method signature 表示在方法上繼續使用throws關鍵字拋出異常
此時運行程序,查看結果:
雖然在主方法上添加了throws關鍵字拋出異常,編譯確實能通過,但是程序發生了異常,終究是需要進行處理的,既然沒有處理,那么最終就會導致程序終止運行。
(3)簡要說明
當調用者在調用有拋出異常的方法時,除了可以在調用程序中直接進行try…catch異常處理外,也可以根據提示使用throws關鍵字繼續將異常拋出,這樣程序也能編譯通過。但是,程序發生了異常,終究是需要進行處理的,如果沒有被處理,程序就會非正常終止。
五、課后作業
任務、給排序靜態方法拋出異常
編寫排序靜態方法:public static void sort(int[] arr) throws Exception {}
主方法:靜態初始化數組arr,輸出全部數組元素,調用sort(arr),輸出全部數組元素
對可能出錯的代碼進行異常處理(傳入的arr參數是null時就要拋出異常)
當傳入sort()方法的數組參數arr不是null時,結果如下:
當傳入sort()方法的數組參數arr是null時,結果如下:
Java 數據結構
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。