捕獲異常是通過3個關鍵詞來實現的:try-catch-finally。用try來執行一段程序,如果出現異常,系統拋出一個異常,可以通過它的類型來捕捉(catch)並處理它,最后一步是通過finally語句為異常處理提供一個統一的出口,finally所指定的代碼都要被執行(catch語句可有多條;finally語句最多只能有一條,根據自己的需要可有可無)。如圖所示。
上面過程詳細解析:
1. try:
try語句指定了一段代碼,該段代碼就是異常捕獲並處理的范圍。在執行過程中,當任意一條語句產生異常時,就會跳過該條語句中后面的代碼。代碼中可能會產生並拋出一種或幾種類型的異常對象,它后面的catch語句要分別對這些異常做相應的處理。
一個try語句必須帶有至少一個catch語句塊或一個finally語句塊 。
注意事項
當異常處理的代碼執行結束以后,不會回到try語句去執行尚未執行的代碼。
2. catch:
n-每個try語句塊可以伴隨一個或多個catch語句,用於處理可能產生的不同類型的異常對象。
n-常用方法,這些方法均繼承自Throwable類 。
u-toString ()方法,顯示異常的類名和產生異常的原因
u-getMessage()方法,只顯示產生異常的原因,但不顯示類名。
u-printStackTrace()方法,用來跟蹤異常事件發生時堆棧的內容。
n-catch捕獲異常時的捕獲順序:
u-如果異常類之間有繼承關系,在順序安排上需注意。越是頂層的類,越放在下面,再不然就直接把多余的catch省略掉。 也就是先捕獲子類異常再捕獲父類異常。
2. finally:
n-有些語句,不管是否發生了異常,都必須要執行,那么就可以把這樣的語句放到finally語句塊中。
n-通常在finally中關閉程序塊已打開的資源,比如:關閉文件流、釋放數據庫連接等。
try-catch-finally語句塊的執行過程:
try-catch-finally程序塊的執行流程以及執行結果比較復雜。
基本執行過程如下:
程序首先執行可能發生異常的try語句塊。如果try語句沒有出現異常則執行完后跳至finally語句塊執行;如果try語句出現異常,則中斷執行並根據發生的異常類型跳至相應的catch語句塊執行處理。catch語句塊可以有多個,分別捕獲不同類型的異常。catch語句塊執行完后程序會繼續執行finally語句塊。finally語句是可選的,如果有的話,則不管是否發生異常,finally語句都會被執行。
注意事項
1. 即使try和catch塊中存在return語句,finally語句也會執行。是在執行完finally語句后再通過return退出。
2. finally語句塊只有一種情況是不會執行的,那就是在執行finally之前遇到了System.exit(0)結束程序運行。
【示例】典型代碼(先不要敲!!)
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
|
import
java.io.FileNotFoundException;
import
java.io.FileReader;
import
java.io.IOException;
public
class
Test8 {
public
static
void
main(String[] args) {
FileReader reader =
null
;
try
{
reader =
new
FileReader(
"d:/a.txt"
);
char
c = (
char
) reader.read();
char
c2 = (
char
) reader.read();
System.out.println(
""
+ c + c2);
}
catch
(FileNotFoundException e) {
e.printStackTrace();
}
catch
(IOException e) {
e.printStackTrace();
}
finally
{
try
{
if
(reader !=
null
) {
reader.close();
}
}
catch
(Exception e) {
e.printStackTrace();
}
}
}
}
|