異常:
是什麼? 是對問題的描述。將問題進行對象的封裝。
--------------------------------------
異常體系
Throwable
|---Error
|---Exception
|--RuntimeException
異常體系的特點:異常體系中的所有類以及對象都具備可拋性。
也就是說可以被throw和throws關鍵字所操作。
只有異常體系具備這個特點。
--------------------------------------
throw和throws的用法:
throw定義在函數上,用於拋出異常對象
throws定義在函數上,用於拋出異常類。可以拋出多個用逗號個隔開。
當函數內容有throw拋出異常對象,並未進行try處理,必須要在函數上聲明,都在編譯失敗。
注意,RuntimeException除外,也就說,函數內如果拋出的RuntimeException異常看,函數上不可以聲明
如果函數聲明瞭異常,調用者需要進行處理,處理方法可以throw可以try.
--------------------------------------
異常有兩種:
編譯是被檢測到的異常
該異常在編譯時,如果沒有處理(沒有拋也沒有try),編譯失敗。
該異常被標識,代表這可以被處理。
運行時異常(編譯時不檢測)
在編譯時,不需要處理,編譯器不檢查。
該異常的發生,建議不處理,讓程序停止,需要對代碼進行修正。
--------------------------------------
異常處理語句:
try {
需要檢測的代碼;
} catch() {
處理異常的代碼;
} finally {
一定會執行的代碼
}
有三種結合方式
1, try {
} catch() {
}
2, try {
} finally {
}
3, try {
} catch() {
} finally {
}
注意:
1,finally中定義的通常是關閉資源管理代碼,因爲資源必須釋放。
2,finally只有一種情況不會執行,當執行到System.exit(0);finally不會執行。(因爲System.exit(0),代表JVM退出
--------------------------------------
自定義異常:
定義類繼承Exception或者RuntimeException
1,爲了讓該自定義類具備可拋性。
2,讓該類具備操作異常的共性方法。
當要自定義異常的信息是,可以使用父類已經定義好的功能,
將異常信息傳遞給父類的構造函數。 示例如下:
class MyException extends Exception{
MyException(String mas) {
super(mas);
}
}
自定義異常,按照java的面向對象思想,將程序何總出現的特有問題進行封裝。
--------------------------------------
異常的好處:
1,將問題繼續封裝。
2,將正常的流程代碼和問題處理代碼相分離,方便於閱讀。
異常的處理原則:
1,處理方式有兩種:try或者throws。
2,調用到拋出異常的功能時,拋出幾個,就處理幾個。
一個try可以對用多個catch
3,多個catch,父類的catch放到最下面。
4,catch內,需要定義針對性的處理方式,不要簡單的定義printStackTrace;輸出語句。也不要不寫。
當捕獲到的異常,本功能處理不了時,可以繼續在catch中拋出。 示例:
try {
throw new AException;
} catch(AException e) {
throw e
}
如果該異常處理不了。但並不屬於該功能出現的異常。
可以將異常轉換後,再拋出和該功能相關的異常。
或者異常可以處理,當需要將異常產生的和本功能相關的問題提供出去。
讓調用者知道,並處理,也可以將捕獲異常處理後,轉換新的異常。
try {
throw new AException();
} catch(AException e) {
//對AException進行處理。
throw new BException(); //異常轉換。
}
異常的注意事項:
在子父類覆蓋時:
1,子類拋出的異常必須是父類異常的子類或者子集。
2,如果父類或者接口沒有異常拋出時,子類覆蓋出現異常,只能try不能拋
/*
老師帶電腦上課
通過名詞提練法,發現有電腦類和老師類兩個類
經分析。電腦類會有可能出現異常
可能出現的異常是
電腦藍屏
電腦冒煙
經分析:電腦可能會在運行過程中發生異常。
所以在電腦運行時捕捉異常
經分析。電腦冒煙老師解決不了,報告自己上司也不行
所以準備拋出自己的異常類。那就是課時無法進行
*/
//定義一個電腦藍屏異常類
class LanPingException extends Exception {
LanPingException(String mas) {
super(mas);
}
}
//定義一個電腦異常冒煙類
class MaoYanException extends Exception {
MaoYanException(String mas) {
super(mas);
}
}
//課時無法進行異常類
class NoPlanException extends Exception {
NoPlanException(String mas) {
super(mas);
}
}
//定義一個電腦類
class Computer {
private int a; //定義一個電腦狀態值,1:爲正常運行。2:爲藍屏。3:爲冒煙
//運行函數
public void run(int a) throws LanPingException, MaoYanException {
System.out.println("電腦開始運行"); //如果狀態是1,電腦正常運行
if(a == 2)
throw new LanPingException("電腦藍屏了"); //假如狀態是2.電腦藍屏
else if(a == 3)
throw new MaoYanException("電腦冒煙了"); //假如狀態是3,電腦冒煙
}
//重啓函數
public void reset() throws NoPlanException {
System.out.println("電腦重啓");
try {
run(3);
} catch(LanPingException e) {
reset(); //假如電腦藍屏了,就把電腦重啓
} catch(MaoYanException e) {
System.out.println(e.toString());
throw new NoPlanException("課時無法進行");
}
}
}
//定義一個老師類
class Teacher {
private String name;
private Computer comp;
//寫一個構造函數。可以指定老師的名字
Teacher(String name) {
this.name = name;
comp = new Computer();
}
//老師講課的函數
public void jiangKe() throws NoPlanException {
try {
comp.run(2);
} catch(LanPingException e) {
System.out.println(e.toString()); //打印電腦出什麼錯誤了
comp.reset(); //假如電腦藍屏了,就把電腦重啓
} catch(MaoYanException e) {
throw new NoPlanException("課時無法進行");
}
System.out.println("上課");
}
}
//運行測試類
class ExceptionDemo4 {
public static void main(String[] args) throws NoPlanException {
Teacher t = new Teacher("畢老師");
try {
t.jiangKe();
} catch(NoPlanException e) {
System.out.println(e.toString());
System.out.println("畢老師去休息。讓張老師上陣");
Teacher t1 = new Teacher("張老師");
try {
t1.jiangKe();
} catch(NoPlanException el) {
System.out.println("老師有事,今天放假");
}
}
}
}
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity開發</a>、<a href="http://edu.csdn.net"target="blank">.Net培訓</a>、期待與您交流! ----------------------
詳細請查看:<a href="http://edu.csdn.net" target="blank">http://edu.csdn.net</a>