十、異常
1、系統結構圖(xmind)
2、tips
——1.throw和throws的區別
1.throws用於標識函數暴露出的異常類,並且可以拋出多個,用逗號分隔。throw用於拋出異常對象。
2.thorws用在函數上,後面跟異常類名。throw用在函數內,後面跟異常對象。
定義功能方法時,需要把出現的問題暴露出來讓調用者去處理,那麼就通過throws在函數上標識。在功能方法內部出現某種情況,程序不能繼續運行,需要進行跳轉時,就用throw把異常對象拋出。
——2.異常的分類
1.編譯時被檢測異常:這種問題一旦出現,希望在編譯時就進行檢測,讓這種問題有對應的處理方式,這樣的問題都可以針對性的處理。
2.編譯時不被檢測異常(運行時異常):這種問題的發生,無法讓功能繼續,更多是因爲調用的原因導致的或者引發了內部狀態的改變導致的,這種問題一般不處理,直接編譯通過,在運行時,讓調用者調用時的程序強制停止,讓調用者對代碼進行調整。所以自定義異常時要麼繼承Exception,要麼繼承RuntimeException。
——3.格式與注意事項
RuntimeException是那些可能在Java虛擬機正常運行期間拋出的異常的超類。
可能在執行方法期間拋出但未被捕獲的RuntimeException的任何子類都無需在throws子句中進行聲明。
異常處理的捕捉形式:
可以對異常進行針對性處理的方式。
具體格式是:
try
{
//需要被檢測異常的代碼。
}
catch(異常類變量)//該變量用於接收發生的異常對象
{
//處理異常的代碼。
}
finally
{
//一定會執行的代碼;
}
注意事項:
finally代碼塊只有一種情況不會被執行,就是在之前執行了System.exit(0)。
處理過程:
try中檢測到異常會將異常對象傳遞給catch,catch捕獲到異常進行處理。
finally裏通常用來關閉資源。比如:數據庫資源,IO資源等。
需要注意:try是一個獨立的代碼塊,在其中定義的變量只在該變量塊中有效。
如果在try以外繼續使用,需要在try外建立引用,在try中對其進行初始化。IO,Socket就會遇到。
/*
老師用電腦:
有兩個對象:電腦,老師
其中涉及兩個問題:
比如藍屏,冒煙。
*/
class lanpinException extends Exception
{
lanpinException(String msg)
{
super(msg);
}
}
class maoyanException extends Exception
{
maoyanException(String msg)
{
super(msg);
}
}
class NoplanException extends Exception
{
NoplanException(String msg)
{
super(msg);
}
}
//描述電腦對象,拋出藍屏和冒煙兩個異常。
class computer
{
private int state = 1;//0,2
public void run()throws lanpinException,maoyanException
{
if(state == 1)
throw new lanpinException("電腦藍屏了");
if(state == 2)
throw new maoyanException("電腦冒煙了");
System.out.println("電腦運行");
}
//重啓功能
public void reset()
{
state = 0;
System.out.println("電腦重啓");
}
}
//老師對象,使用電腦,當電腦冒煙異常觸發時,拋出計劃外異常
class teacher
{
private String name;
private computer comp;
//老師這個對象有使用電腦的行爲以及老師姓名的屬性
teacher(String name)
{
this.name = name;
comp = new computer();
}
//老師有講課功能,講課中使用電腦可能出現異常,捕捉
public void prelect()throws NoplanException
{
try
{
comp.run();
System.out.println(name+"講課");
}
catch (lanpinException e)
{
System.out.println(e.toString());
comp.reset();
prelect();
}
catch (maoyanException e)
{
System.out.println(e.toString());
test();
throw new NoplanException("課時無法進行,原因:"+e.getMessage());
}
}
public void test()
{
System.out.println("大家練習");
}
}
class ExceptionDemo2
{
public static void main(String[] args)
{
//創建老師對象,講課期間可能出現異常,捕捉
teacher t = new teacher("老師");
try
{
t.prelect();
}
catch (NoplanException e)
{
System.out.println(e.toString()+"...換人");
}
}
}
運行結果: