Java中的@SneakyThrows注解詳解
背景:
? 在 java 的異常體系中 Exception 異常有兩個(gè)分支,一個(gè)是運(yùn)行時(shí)異常 RuntimeException ,一個(gè)是編譯時(shí)異常,在 Exception 下的所有非 RuntimeException 異常,比如 IOException 、 SQLException 等;所有的運(yùn)行時(shí)異常不捕獲,編譯時(shí)異常是一定要捕獲,否則編譯會(huì)報(bào)錯(cuò)。 @SneakyThrows 就是利用了這一機(jī)制,將當(dāng)前方法拋出的異常,包裝成 RuntimeException ,騙過編譯器,使得調(diào)用點(diǎn)可以不用顯示處理異常信息。
使用范圍:
只能作用在方法和構(gòu)造函數(shù)之上
原理:
/* * 若不使用@SneakyThrows注解,newInsstance方法會(huì)要求拋出InstantiationException, * IllegalAccessException異常,且調(diào)用sneakyThrowsTest()的地方需要捕獲這些異常, * 加上@SneakyThrows注解之后就不需要捕獲異常信息。 */ @SneakyThrows private void sneakyThrowsTest(){ SneakyThrowsDemo.class.newInstance(); }
如下為反編譯之后的結(jié)果
private void sneakyThrowsTest() { try { HelloController.class.newInstance(); } catch (Throwable e) { // 調(diào)用Lombok方法轉(zhuǎn)化為RuntimeException throw Lombok.sneakyThrow(e); } } // =========== ombok ========= public static RuntimeException sneakyThrow(Throwable t) { if (t == null) { throw new NullPointerException("t"); } else { return Lombok.<RuntimeException>sneakyThrow0(t); } } /* * 這個(gè)方法是關(guān)鍵,這里對(duì)入?yún)㈩愋偷募s束為<T extends Throwable>,將異常強(qiáng)轉(zhuǎn)為T類型 */ private static <T extends Throwable> T sneakyThrow0(Throwable t) throws T { throw (T)t; }
Error和Exception區(qū)分
- Error是編譯時(shí)錯(cuò)誤和系統(tǒng)錯(cuò)誤,系統(tǒng)錯(cuò)誤在除特殊情況下,都不需要你來關(guān)心,基本不會(huì)出現(xiàn)。而編譯時(shí)錯(cuò)誤,如果你使用了??編譯器??,那么編譯器會(huì)提示。
- Exception則是可以被拋出的基本類型,我們需要主要關(guān)心的也是這個(gè)類。
- Exception又分為RunTimeException和其他Exception。
RunTimeException和其他Exception區(qū)分
其他Exception,受檢查異常??梢岳斫鉃殄e(cuò)誤,必須要開發(fā)者解決以后才能編譯通過,解決的方法有兩種
- throw到上層
- try-catch處理
RunTimeException:運(yùn)行時(shí)異常,又稱不受檢查異常,不受檢查,因?yàn)椴皇軝z查,所以在代碼中可能會(huì)有RunTimeException時(shí)Java編譯檢查時(shí)不會(huì)告訴你有這個(gè)異常,但是在實(shí)際運(yùn)行代碼時(shí)則會(huì)暴露出來,比如經(jīng)典的1/0,空指針等。
如果不處理也會(huì)被Java自己處理。
到此這篇關(guān)于Java中的@SneakyThrows注解詳解的文章就介紹到這了,更多相關(guān)@SneakyThrows注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java爬蟲實(shí)現(xiàn)爬取京東上的手機(jī)搜索頁面 HttpCliient+Jsoup
下面小編就為大家分享一篇Java爬蟲實(shí)現(xiàn)爬取京東上的手機(jī)搜索頁面 HttpCliient+Jsoup,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-11-11Spring實(shí)現(xiàn)源碼下載編譯及導(dǎo)入IDEA過程圖解
這篇文章主要介紹了Spring實(shí)現(xiàn)源碼下載編譯及導(dǎo)入IDEA,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07淺談一下RabbitMQ、Kafka和RocketMQ消息中間件對(duì)比
這篇文章主要介紹了淺談一下RabbitMQ、Kafka和RocketMQ消息中間件對(duì)比,消息中間件屬于分布式系統(tǒng)中一個(gè)字系統(tǒng),關(guān)注于數(shù)據(jù)的發(fā)送和接收,利用高效可靠的異步信息傳遞機(jī)制對(duì)分布式系統(tǒng)中的其余各個(gè)子系統(tǒng)進(jìn)行集成,需要的朋友可以參考下2023-05-05Maven默認(rèn)中央倉(cāng)庫(settings.xml 配置詳解)
這篇文章主要介紹了Maven默認(rèn)中央倉(cāng)庫(settings.xml 配置詳解),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12JavaWeb登錄界面登錄失敗在同一頁面進(jìn)行提示的解決
這篇文章主要介紹了JavaWeb登錄界面登錄失敗在同一頁面進(jìn)行提示的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11Springboot項(xiàng)目中定時(shí)任務(wù)的四種實(shí)現(xiàn)方式詳解
Spring的@Scheduled注解是一種非常簡(jiǎn)單和便捷的實(shí)現(xiàn)定時(shí)任務(wù)的方式,通過在方法上添加@Scheduled注解,我們可以指定方法在特定的時(shí)間間隔或固定的時(shí)間點(diǎn)執(zhí)行,本文給大家介紹Springboot項(xiàng)目中定時(shí)任務(wù)的四種實(shí)現(xiàn)方式,感興趣的的朋友一起看看b2024-02-02關(guān)于maven打包時(shí)的報(bào)錯(cuò): Return code is: 501 , ReasonPhrase:HTTPS Requ
這篇文章主要介紹了關(guān)于maven打包時(shí)的報(bào)錯(cuò): Return code is: 501 , ReasonPhrase:HTTPS Required,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09maven?插件?assembly?打tar.gz包的詳細(xì)過程
這篇文章主要介紹了maven插件assembly打tar.gz包的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06