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

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

第一種,代碼變成這樣
public void a() throws IOException {
b();
}
第二種,代碼變成這樣
@SneakyThrows
public void a() {
b();
}
第三種,代碼就是傳統的try...catch了
public void a() {
try {
b();
} catch (IOException e) {
e.printStackTrace();
}
}
從上面三段代碼來說,無疑lombok封裝的@SneakyThrows代碼最為簡潔,添加它之后,IDE的警告就沒有了,它實際是把Exception偽裝成了RuntimeException,把JVM給欺騙了。
下面代碼選自sneakyThrow的實現,它將我們的異常強轉成了RuntimeException異常,編譯器一看它不是Exception異常,所以警告信息也就沒了。
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;
}
