lombok~@SneakyThrows注解讓代碼更優(you)雅
我們知道,java里的異常分為Exception和RuntimeException兩大類,RuntimeException異常會由運行時幫我們進行捕獲,統一進行處理;而Exception異常是受檢異常(Checked Exception),需要我們自己在代碼里顯示的聲明和處理。
RuntimeException異常的(de)代(dai)表
- llegalArgumentException
- IllegalAnnotationException
- EncodingException
Exception的代表(biao)
- IOException
- IllegalBlockSizeException
- GeneralSecurityException
- IllegalAccessException
問題表現
在一個類中,定義兩個方法a和b,b方法會聲明throws IOException,a方法里面在調用b方法里,也需要對這個IOException進行處理,這時IDE會提升我們,需要顯示的實現這個異常的捕獲。

如下面和圖所示,你有三種選擇,添加throws,添加lombok @SneakyThrows注解,以及添加try...catch等

第一(yi)種,代碼變(bian)成這樣
public void a() throws IOException {
b();
}
第(di)二(er)種,代碼(ma)變(bian)成這樣
@SneakyThrows
public void a() {
b();
}
第三種,代碼就是傳統的try...catch了
public void a() {
try {
b();
} catch (IOException e) {
e.printStackTrace();
}
}
從(cong)上面三(san)段代碼來說,無疑(yi)lombok封裝的(de)@SneakyThrows代碼最(zui)為簡潔,添加它之(zhi)后,IDE的(de)警告就沒有了(le),它實(shi)際是把Exception偽裝成了(le)RuntimeException,把JVM給(gei)欺騙了(le)。
下(xia)面(mian)代(dai)碼選自sneakyThrow的(de)實(shi)現,它將我們的(de)異常強轉成了(le)RuntimeException異常,編(bian)譯器一看(kan)它不是(shi)Exception異常,所(suo)以(yi)警告(gao)信(xin)息(xi)也就沒了(le)。
public static RuntimeException sneakyThrow(Throwable t) {
if (t == null) throw new NullPointerException("t");
return Lombok.<RuntimeException>sneakyThrow0(t);
}
private static <T extends Throwable> T sneakyThrow0(Throwable t) throws T {
throw (T)t;
}