1、異常的定義:程序在運行時出現不正常情況。
異常的劃分:
Error:嚴重的問題,對于error一般不編寫針對性的代碼對其進行處理。
Exception:非嚴重的問題,對于exception可以使用針對性的處理方式進行處理。
2、異常的處理:(固定格式)
1
2
3
4
5
6
7
8
9
10
11
|
try {需要被檢測的代碼;} catch (異常類 變量) {處理異常的代碼(處理方式);} //這里應當是要有針對性的處理方式 finally {一定會執行的語句;} //通常是關閉資源的代碼,因為資源必須得到釋放 |
對多異常的處理方式:
1、聲明異常時,建議聲明更為具體的異常,這樣處理起來就更加的具體。
2、對方聲明幾個異常,就對應及格catch塊,不要定義多余的catch塊,如果多個catch塊中的異常出現繼承關系,父類異常catch塊放在最下面。
*在進行catch處理時,catch中一定要定義具體的處理方式。
*catch是用于處理異常,如果沒有catch就代表異常沒有被處理過,如果該異常是檢測時異常,那么必須聲明。
Runtime異常:(即運行時異常)
是Exception中一個特殊的子類異常。
如果在函數內拋出該異常,函數上可以不用聲明,編譯一樣通過;如果在函數上聲明了該異常,調用者可以不用進行處理,編譯一樣通過。
之所以用在函數上聲明,是因為不需要讓調用者處理。
異常在子父類覆蓋中的體現;
1,子類在覆蓋父類時,如果父類的方法拋出異常,那么子類的覆蓋方法,只能拋出父類的異常或者該異常的子類。
2,如果父類方法拋出多個異常,那么子類在覆蓋該方法時,只能拋出父類異常的子集。
3,如果父類或者接口的方法中沒有異常拋出,那么子類在覆蓋方法時,也不可以拋出異常。
如果子類方法發生了異常。就必須要進行try處理。絕對不能拋。
throws 和 throw 的區別:
throws:使用在函數上(小括號和大括號之間),后面跟的是異常類,可以跟多個。中間用“,”(逗號)隔開。
throw: 使用在函數內,后面跟的是異常對象。throw后面不能加語句,因為throw后面的語句無法執行到。
習題練習:
1
2
3
4
5
6
7
8
9
|
/*需求:畢老師用電腦上課。 分析: 先寫出正常運行時的代碼:電腦開機后上課 分析電腦會出現的問題,如:藍屏,冒煙 此時需要自定義兩個“藍屏,冒煙“”自定義異常,封裝成對象。 藍屏后,電腦重啟,之后繼續上課 電腦冒煙后,出現了老師的問題,不能上課了,可以先做練習,畢老師將問題拋給校長。此時拋出的問題不再是電腦冒煙,而應該是老師不能上課了 問題拋給校長后,校長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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
class LanPingException extends Exception //自定義藍屏異常 { LanPingException(String message) { super (message); } } class MaoYanException extends Exception //自定義冒煙異常 { MaoYanException(String message) { super (message); } } class NoclassException extends Exception //自定義不能上課異常 { NoclassException(String message) { super (message); } } class Computer { private int state = 2 ; //硬性規定電腦狀態 //問題是在運行時發生的,所以得定義在運行時 public void run() throws LanPingException,MaoYanException //因為有可能出現錯誤,所以必須先聲明 { if (state== 2 ) { throw new LanPingException( "電腦藍屏了。。。" ); //因為電腦不能自己處理,所以拋給了老師 } if (state== 3 ) { throw new MaoYanException( "電腦冒煙了。。。" ); } System.out.println( "電腦開機,運行中。。。。" ); } public void restart() { System.out.println( "電腦重啟。。。。" ); } } class Teacher { private String name; private Computer comp; Teacher(String name) { this .name = name; comp = new Computer(); //初始化時老師就有電腦了 } public void test() { System.out.println( "做練習" ); } public void teach() throws NoclassException //標識應該是拋出去的異常,能夠進行處理的 { try { comp.run(); //講課,要先開啟電腦 } catch (LanPingException e) //拋出了兩個異常,必須用兩個catch { System.out.println(e.getMessage()); comp.restart(); } //這個問題拋給老師的話依舊無法解決,應該拋出對應的問題,這里老師拋出的問題應該是不能上課了 catch (MaoYanException e) { test(); //不能上課,可以先布置練習,這個必須在throw 之前,因為throw之后的語句不會執行 throw new NoclassException(e.getMessage()+ ",無法繼續上課" ); } System.out.println(name+ ",上課中。。。。" ); } } class ExceptionTest { public static void main(String[] args) { Teacher t = new Teacher( "畢老師" ); //指定一個老師 try { t.teach(); //老師運行這個方法 } catch (NoclassException e) //抓住對應的拋出的問題 { System.out.println(e.toString()); //打印出問題原因 System.out.println( "自習或者放假" ); //處理辦法 } } } |
1
2
3
4
5
6
7
8
9
10
11
|
當電腦狀態為 1 時,輸出為: 電腦開機,運行中。。。。 畢老師,上課中。。。。 當電腦狀態為 2 時,輸出為: 電腦藍屏了。。。 電腦重啟。。。。 畢老師,上課中。。。。 當電腦狀態為 3 時,輸出為: 做練習 NoclassException: 電腦冒煙了。。。,無法繼續上課 自習或者放假 <br> |
如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/u012324102/article/details/53535617