---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity開發</a>、<a href="http://www.itheima.com"target="blank">.Net培訓</a>、期待與您交流! ----------------------
異常:
什麼是異常?
異常時對問題的描述,將問題進行對象封裝。
異常體系:
Throwable
|--Error
|--多個子類
|--Exception
|--RuntimeException 其中以個特殊的子類
|--其他的多個子類
異常體系的特點:
異常體系中的所有類及其產生的對象都具有可拋性,
就是說可以被throw和throws關鍵字操作。
只有異常體系具備這樣的特點!
Exception異常有兩種:
編譯時被檢測異常
該異常在編譯時,如果沒有處理(沒有拋出),編譯失敗。
該異常被標識,代表可以被處理。
運行時異常(編譯時不檢測)
在編譯時,不需要處理,編譯器不檢測。
該異常的發生,建議不處理,讓程序停止。需要對代碼進行修正。
throw和throws的用法和區別:
throw定義在方法內部,用於拋出異常對象。
throws定義在函數上,用於聲明拋出的異常類,可以聲明多個,用逗號隔開。
當函數內容有throw拋出異常對象,並未進行try處理。必須要再函數上聲明,否則編譯失敗。
注:RuntimeException 除外。即,函數內如果拋出RuntimeException 異常,函數上可以不聲明異常類。
如果函數聲明瞭異常,調用者需要進行處理。處理方式有throws或者try。
處理方式一:try--catch塊
注:在使用多路異常捕捉時,子類要再父類前面
1,try--catch--catch
try {
//被檢測的代碼
}
catch (IOException e) {//子類異常
// TODO: handle exception
}//...可以有多個catch塊
catch (Exception e) {//父類異常
// TODO: handle exception
}
2,try--catch--finally
try {
//被檢測的代碼
}
catch (Exception e) {
// TODO: handle exception
}
finally {
//始終要執行的代碼
}3,try--finally
try {
//被檢測的代碼
}
finally {
//始終要執行的代碼
}
注意:
1,finally中定義的通常是,關閉源代碼。因爲資源必須釋放。
2,finally中有一種情況不會執行,當執行到System.exit(0);finally不會執行。
自定義異常:
定義類繼承Exception或者RuntimeException
1,爲了讓該類具有可拋性。
2,讓該類具備操作異常的共性方法。
當要定義自定義異常的信息時,可以使用父類已經定義好的功能。
異常信息傳遞給父類的構造函數。
自定義異常類實例代碼:
public class MyException extends Exception{
//定義參構造函數,並將參數傳給父類對應的構造函數。
public MyException(String message){
super(message);
}
}
自定義異常類:按照java面向對象思想,將程序中出現的特有問題進行封裝。
異常的好處:
1,將問題進行封裝,
2,將正常流程代碼與異常處理代碼相分離,編譯閱讀。
異常處理的原則:
1,處理方式有兩種:try或者throws拋。
2,調用到拋出異常的功能時,拋出幾個就處理幾個。
一個try塊可以有多個catch。
3,多個catch,父類要放到最後。
4,catch內,需要定義針對性的處理方式,不要簡單的定義printStackTrace()等默認的輸出語句;
也不要不寫。
當捕捉到異常,本功能處理不了是,可以繼續在catch中拋出。
try {
throw new Exception();
} catch (Exception e) {
throw e;
}
可以將異常轉換後,在拋出和該異常相關的異常。
或者異常可以處理,當需要將異常產生的和本功能相關的問題提供出去,
讓調用者知道,並處理。也可以將捕獲異常處理後轉換新的異常。
try {
throw new Exception();
} catch (Exception e) {
throw new MyException("異常轉換了。");
}異常注意事項:
在子父類覆蓋時:
1,子類拋出的異常,必須是父類的異常本身,或子類或子集。
2,如果父類或者接口沒有異常拋出是,子類覆蓋出現異常,只能try,不能throws。
代碼參考如下:
package com.itheima.exception.exceptioncase;
/**
* 課堂異常測試類
* @author wuyong
*
*/
public class SchoolExceptionTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//實例化老師類對象
Computer com = new Computer();
//電腦類對象
Teacher teac = new Teacher(com);
//1標識電腦藍屏
com.setState(1);
//2標識電腦冒煙
// com.setState(2);
try {
com.run();
teac.teach();
} catch (BlueScreenException e) {//藍屏異常
System.out.println(e.toString());
com.reset();
teac.teach();
} catch (SmokingException e) {//冒煙異常
System.out.println(e.toString() + ",課程無法繼續");
}
}
}
/**
* 電腦類
* @author wuyong
*
*/
class Computer {
//電腦狀態,1表示藍屏,2,表示冒煙
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
/**
* 構造函數
*/
public Computer(){}
public Computer(int state){
this.state = state;
}
/**
* 運行方法
* @throws BlueScreenException
* @throws SmokingException
*/
public void run() throws BlueScreenException, SmokingException {
if (state == 1) {
throw new BlueScreenException("電腦藍屏了。");
}
if (state == 2) {
throw new SmokingException("電腦冒煙了");
}
System.out.println("電腦運行");
}
/**
* 重啓方法
*/
public void reset() {
state = 0;
System.out.println("電腦重啓");
}
}
/**
* 老師類
* @author wuyong
*
*/
class Teacher {
private Computer com;
public Teacher(){}
public Teacher(Computer com){
this.com = com;
}
/**
* 上課
*/
public void teach() {
System.out.println("老師講課");
}
}
/**
* 自定義電腦藍屏異常類
* @author wuyong
*
*/
class BlueScreenException extends Exception {
public BlueScreenException(String message){
super(message);
}
}
/**
* 自定義電腦冒煙異常類
* @author wuyong
*
*/
class SmokingException extends Exception {
public SmokingException(){}
public SmokingException(String message){
super(message);
}
}
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity開發</a>、<a href="http://www.itheima.com"target="blank">.Net培訓</a>、期待與您交流! ----------------------