項目中,有些情況下需要拋出特定的異常來進行提示,這時就需要我們自己來自定義異常來使用。
1. throw跟throws關鍵字
- throws關鍵字
用來聲明一個方法可能產(chǎn)生的所有異常捂敌,不做任何處理而是將異常往上傳,誰調(diào)用我我就拋給誰既琴。- 用在方法聲明后面占婉,跟的是異常類名
- 可以跟多個異常類名,用逗號隔開
- 表示拋出異常甫恩,由該方法的調(diào)用者來處理
- throws表示出現(xiàn)異常的一種可能性锐涯,并不一定會發(fā)生這些異常
- throw關鍵字
用來拋出一個具體的異常類型- 用在方法體內(nèi),跟的是異常對象名
- 只能拋出一個異常對象名
- 表示拋出異常填物,由方法體內(nèi)的語句處理
- throw則是拋出了異常纹腌,執(zhí)行throw則一定拋出了某種異常
2. RuntimeException和Exception
- java將所有的錯誤封裝為一個對象,其根本父類為Throwable, Throwable有兩個子類:Error和Exception滞磺。
- Error是Throwable 的子類升薯,用于指示合理的應用程序不應該試圖捕獲的嚴重問題。大多數(shù)這樣的錯誤都是異常條件击困。雖然 ThreadDeath 錯誤是一個“正規(guī)”的條件涎劈,但它也是 Error 的子類,因為大多數(shù)應用程序都不應該試圖捕獲它阅茶。在執(zhí)行該方法期間蛛枚,無需在其 throws 子句中聲明可能拋出但是未能捕獲的 Error的任何子類,因為這些錯誤可能是再也不會發(fā)生的異常條件脸哀。
- Exception類及其子類是 Throwable 的一種形式蹦浦,它指出了合理的應用程序想要捕獲的條件。
- RuntimeException是那些可能在 Java 虛擬機正常運行期間拋出的異常的超類撞蜂∶は猓可能在執(zhí)行方法期間拋出但未被捕獲的RuntimeException 的任何子類都無需在 throws 子句中進行聲明。它是Exception的子類蝌诡。
- 非RuntimeException必要自己寫catch塊處理掉溉贿。如果不處理,程序?qū)⒊霈F(xiàn)編譯錯誤浦旱。API中寫了throws的Exception都不是RuntimeException宇色。
- RuntimeException不用try catch捕捉將會導致程序運行中斷,若用try catch捕捉則不會中斷。一般情況下宣蠕。對于RuntimeException的子類最好也使用異常處理機制例隆。雖然RuntimeException的異常可以不使用try...catch進行處理植影,但是如果一旦發(fā)生異常,則肯定會導致程序中斷執(zhí)行涎永,所以思币,為了保證程序再出錯后依然可以執(zhí)行,在開發(fā)代碼時最好使用try...catch的異常處理機制進行處理羡微。
image.png
- 常見的RuntimeException
- NullPointerException -- 空指針異常:見的最多了谷饿,一般都是在null對象上調(diào)用方法出現(xiàn);
- NumberFormatException -- 數(shù)字格式化異常:繼承IllegalArgumentException妈倔,字符串轉(zhuǎn)換為數(shù)字時出現(xiàn)博投;
- ArrayIndexOutOfBoundsException -- 數(shù)組越界異常;
- StringIndexOutOfBoundsExceptio -- 字符串越界異常盯蝴;
- ClassCastException -- 類型轉(zhuǎn)換錯誤毅哗;
- IllegalArgumentException -- 非法參數(shù);
3. 自定義異常
- 繼承Throwable
- 繼承Exception
- 繼承RuntimeException
我一般是繼承RuntimeException捧挺,捕獲到以后拋給全局異陈敲啵或者response返回。
import lombok.Getter;
import lombok.Setter;
public class MyArgumentException extends RuntimeException {
private static final long serialVersionUID = 1L;
/**
* 請求的參數(shù)數(shù)據(jù)闽烙,若參數(shù)校驗不通過翅睛,此字段存儲請求參數(shù),返回前端
*/
@Getter
@Setter
private Object paramData;
public MyArgumentException() {
super();
}
public MyArgumentException(String message) {
super(message);
}
public MyArgumentException(String message, Object paramData) {
super(message);
this.paramData = paramData;
}
public MyArgumentException(String message, Throwable cause) {
super(message, cause);
}
public MyArgumentException(Throwable cause) {
super(cause);
}
}
在業(yè)務中將此異常拋給全局異常黑竞。