最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Lombok注解-@SneakyThrows的使用

 更新時間:2022年08月27日 11:50:15   作者:lazyguy  
這篇文章主要介紹了Lombok注解-@SneakyThrows的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Lombok注解@SneakyThrows

@SneakyThrows注解的用途得從java的異常設(shè)計體系說起。

java中我們常見的2類異常。

  • 1.普通Exception類,也就是我們常說的受檢異?;蛘逤hecked Exception。
  • 2.RuntimeException類,既運行時異常。

前者會強制要求拋出它的方法聲明throws,調(diào)用者必須顯示的去處理這個異常。設(shè)計的目的是為了提醒開發(fā)者處理一些場景中必然可能存在的異常情況。比如網(wǎng)絡(luò)異常造成IOException。

但是現(xiàn)實,往往事與愿違。大部分情況下的異常,我們都是一路往外拋了事。(強制處理我也處理不了??!臣妾做不到)所以漸漸的java程序員處理Exception的常見手段就是外面包一層RuntimeException,接著往上丟。這種解決思想尤其在Spring中到處出現(xiàn)。

try {
} catch (Exception e){
? ?throw new RuntimeException(e);
}

Lombok的@SneakyThrows就是為了消除這樣的模板代碼。

使用注解后不需要擔(dān)心Exception的處理

?import lombok.SneakyThrows;
public class SneakyThrowsExample implements Runnable {
? @SneakyThrows(UnsupportedEncodingException.class)
? public String utf8ToString(byte[] bytes) {
? ? return new String(bytes, "UTF-8");
? }
??
? @SneakyThrows
? public void run() {
? ? throw new Throwable();
? }
}

真正生成的代碼

import lombok.Lombok;
public class SneakyThrowsExample implements Runnable {
? public String utf8ToString(byte[] bytes) {
? ? try {
? ? ? return new String(bytes, "UTF-8");
? ? } catch (UnsupportedEncodingException e) {
? ? ? throw Lombok.sneakyThrow(e);
? ? }
? }
??
? public void run() {
? ? try {
? ? ? throw new Throwable();
? ? } catch (Throwable t) {
? ? ? throw Lombok.sneakyThrow(t);
? ? }
? }
}

原理

顯然魔法 藏在Lombok.sneakyThrow(t);中??赡艽蠹叶紩詾檫@個方法就是new RuntimeException()之類的。然而事實并非如此。閱讀代碼可以看出整個方法其實最核心的邏輯是throw (T)t;,利用泛型將我們傳入的Throwable強轉(zhuǎn)為RuntimeException。雖然事實上我們不是RuntimeException。但是沒關(guān)系。因為JVM并不關(guān)心這個。泛型最后存儲為字節(jié)碼時并沒有泛型的信息。這樣寫只是為了騙過javac編譯器。源碼中注釋有解釋。

? ? 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;
? ? }

lombok注解@SneakyThrows探索及與try catch、throws Exception區(qū)別

我在一個開源項目中看到了lombok注解@SneakyThrows,于是探索實踐了一下,有些事情還是要自己操作一下,不然還真的不知道!!

以前就看到項目里有@SneakyThrows注解,一直沒去管他和手動try catch還有往上拋異常有什么區(qū)別?

先說一下結(jié)論,趕時間的朋友看了就可以走了哈?。?/p>

我們發(fā)現(xiàn),@SneakyThrows注解在編譯的時候自動幫我們try catch,使用@SneakyThrows是為了讓代碼更加簡潔,加快我們的開發(fā)效率??!所以還是推薦使用@SneakyThrows來解決異常問題,當(dāng)然如果是已知異常還是自己手動throw。

導(dǎo)入 Maven

<!--Lombok-->
<dependency>
?? ?<groupId>org.projectlombok</groupId>
?? ?<artifactId>lombok</artifactId>
?? ?<scope>provided</scope>
</dependency>

方法測試

public class SneakyTest {
? ? public static void main(String[] args) {
? ? ? ? exceptionTest();
? ? }
? ? public static void exceptionTest(){
? ? ? ? // 模擬一個異常
? ? ? ? FileInputStream fis = new FileInputStream(new File("test.txt"));
? ? }
}

此時Idea提醒我們要捕獲異常,不然無法通過編譯,給出我們?nèi)N解決方案,也就是我們本次要探究的目的??!

在這里插入圖片描述

我們先第一種方式:

public class SneakyTest {
    public static void main(String[] args) throws FileNotFoundException {
        exceptionTest();
    }
    public static void exceptionTest() throws FileNotFoundException {
        // 模擬一個異常
        FileInputStream fis = new FileInputStream(new File("D:\\test.txt"));
    }
}

我們看到我們往上級拋,上級也需要拋,這種一直拋還是要有人處理,所以我們不建議這樣!

第二種方式:

public class SneakyTest {
    public static void main(String[] args) {
        exceptionTest();
    }
    public static void exceptionTest(){
        // 模擬一個異常
        try {
            FileInputStream fis = new FileInputStream(new File("D:\\test.txt"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

我們在本方法內(nèi)處理,這樣就不需要調(diào)用者處理了??!

第三種方式:

也是小編一直疑惑的,為啥會有這個注解,有什么優(yōu)點嗎??

先看解決方式,我們在編譯一下看看究竟怎么解決的異常??!

public class SneakyTest {
    public static void main(String[] args) {
        exceptionTest();
    }
    @SneakyThrows
    public static void exceptionTest(){
        // 模擬一個異常
        FileInputStream fis = new FileInputStream(new File("D:\\test.txt"));;
    }
}

我們編譯一下看一下,下面是class文件

public class SneakyTest {
    public SneakyTest() {
    }
    public static void main(String[] args) {
        exceptionTest();
    }
    public static void exceptionTest() {
        try {
            new FileInputStream(new File("D:\\test.txt"));
        } catch (Throwable var1) {
            throw var1;
        }
    }
}

我們發(fā)現(xiàn),這個注解自動幫我們try catch,使用@SneakyThrows是為了讓代碼更加簡潔,加快我們的開發(fā)效率!!

這樣我們就測試完成了,主要介紹了@SneakyThrows到底幫我們解決了什么問題,我們?yōu)槭裁匆褂聾SneakyThrows。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。 

相關(guān)文章

  • spring Boot打包部署到遠(yuǎn)程服務(wù)器的tomcat中

    spring Boot打包部署到遠(yuǎn)程服務(wù)器的tomcat中

    這篇文章主要給大家介紹了關(guān)于spring Boot打包部署到遠(yuǎn)程服務(wù)器的tomcat中的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • Java調(diào)用商品詳情API的項目實踐

    Java調(diào)用商品詳情API的項目實踐

    在現(xiàn)代電子商務(wù)網(wǎng)站中,商品詳情API是一個重要的組件,本文就來介紹一下Java調(diào)用商品詳情API的項目實踐,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • Java調(diào)用Deepseek實現(xiàn)項目代碼審查

    Java調(diào)用Deepseek實現(xiàn)項目代碼審查

    這篇文章主要為大家詳細(xì)介紹了Java如何調(diào)用Deepseek實現(xiàn)項目代碼審查功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • Seata分布式事務(wù)出現(xiàn)ABA問題解決

    Seata分布式事務(wù)出現(xiàn)ABA問題解決

    這篇文章主要為大家介紹了Seata分布式事務(wù)出現(xiàn)ABA問題解決方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Java面試之如何實現(xiàn)10億數(shù)據(jù)判重

    Java面試之如何實現(xiàn)10億數(shù)據(jù)判重

    當(dāng)數(shù)據(jù)量比較大時,使用常規(guī)的方式來判重就不行了,所以這篇文章小編主要來和大家介紹一下Java實現(xiàn)10億數(shù)據(jù)判重的相關(guān)方法,希望對大家有所幫助
    2024-02-02
  • 淺談Java到底是值傳遞還是引用傳遞呢

    淺談Java到底是值傳遞還是引用傳遞呢

    今天帶大家學(xué)習(xí)Java的相關(guān)知識,文章圍繞著Java到底是值傳遞還是引用傳遞展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • java 讀取文件路徑空格、

    java 讀取文件路徑空格、"+"和中文的處理方法

    今天小編就為大家分享一篇java 讀取文件路徑空格、"+"和中文的處理方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Java Scala泛型(泛型方法,泛型類,泛型特質(zhì),上下界,協(xié)變、逆變、非變)

    Java Scala泛型(泛型方法,泛型類,泛型特質(zhì),上下界,協(xié)變、逆變、非變)

    泛型的意思是泛指某種具體的數(shù)據(jù)類型, 在Scala中, 泛型用[數(shù)據(jù)類型]表示. 在實際開發(fā)中, 泛型一般是結(jié)合數(shù)組或者集合來使用的,這篇文章主要介紹了Scala泛型(泛型方法,泛型類,泛型特質(zhì),上下界,協(xié)變、逆變、非變),需要的朋友可以參考下
    2023-04-04
  • 優(yōu)雅地在Java 8中處理異常的方法詳解

    優(yōu)雅地在Java 8中處理異常的方法詳解

    異常處理是我們在日常開發(fā)中經(jīng)常會遇到的一種需求,下面這篇文章主要給大家介紹了關(guān)于如何優(yōu)雅地在Java 8中處理異常的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們來一起看看吧
    2019-01-01
  • SpringBoot中的@Configuration注解詳解

    SpringBoot中的@Configuration注解詳解

    這篇文章主要介紹了SpringBoot中的@Configuration注解詳解,Spring Boot推薦使用JAVA配置來完全代替XML 配置,JAVA配置就是通過 @Configuration和 @Bean兩個注解實現(xiàn)的,需要的朋友可以參考下
    2023-08-08

最新評論

潜江市| 秦皇岛市| 射阳县| 阜南县| 大港区| 竹山县| 阿拉尔市| 扶绥县| 合川市| 阳曲县| 鄂伦春自治旗| 普定县| 宁强县| 堆龙德庆县| 荥阳市| 花莲市| 安西县| 綦江县| 泸州市| 安陆市| 公主岭市| 桐庐县| 武清区| 陇西县| 汉阴县| 唐河县| 朝阳市| 航空| 中卫市| 毕节市| 咸丰县| 大港区| 平度市| 普兰县| 九台市| 枝江市| 新蔡县| 当雄县| 梨树县| 闽侯县| 章丘市|