亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

我們平時在寫代碼的時候經(jīng)常會遇到這樣的一種情況

 

提示說沒有處理xxx異常

然后解決辦法可以在外面加上try-catch,就像這樣

 

所以我之前經(jīng)常這樣處理

//重新拋出 RuntimeException
public class ThrowsDemo {

    public void demo4throws() {
        try {
            new ThrowsSample().sample4throws();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

//打印日志
@Slf4j
public class ThrowsDemo {

    public void demo4throws() {
        try {
            new ThrowsSample().sample4throws();
        } catch (IOException e) {
            log.error("sample4throws", e);
        }
    }
}

//繼續(xù)往外拋,但是需要每個方法都添加 throws
public class ThrowsDemo {

    public void demo4throws() throws IOException {
        new ThrowsSample().sample4throws();
    }
}

但是我一直不明白

這個方法為什么不直接幫我做

反而要讓我很多余的加上一步

我處理和它處理有什么區(qū)別嗎?

而且變的好不美觀

本來縮進就多,現(xiàn)在加個try-catch更是火上澆油

public class ThrowsDemo {

    public void demo4throws() {
        try {
            if (xxx) {
                try {
                    if (yyy) {

                    } else {

                    }
                } catch (Throwable e) {
                }
            } else {

            }
        } catch (IOException e) {

        }
    }
}

上面的代碼,就算里面沒有業(yè)務(wù),看起來也已經(jīng)比較亂了,分不清哪個括號和哪個括號是一對

還有就是對Lambda很不友好

 

沒有辦法直接用::來優(yōu)化代碼,所以就變成了下面這樣

 

本來看起來很簡單很舒服的Lambda,現(xiàn)在又變得又臭又長

為什么會強制 try-catch

為什么我們平時寫的方法不需要強制try-catch,而很多jdk中的方法卻要呢

那是因為那些方法在方法的定義上添加了throws關(guān)鍵字,并且后面跟的異常不是RuntimeException

一旦你顯式的添加了這個關(guān)鍵字在方法上,同時后面跟的異常不是RuntimeException,那么使用這個方法的時候就必須要顯示的處理

比如使用try-catch或者是給調(diào)用這個方法的方法也添加throws以及對應(yīng)的異常

throws 是用來干什么的

那么為什么要給方法添加throws關(guān)鍵字呢?

給方法添加throws關(guān)鍵字是為了表明這個方法可能會拋出哪些異常

就像一個風險告知

這樣你在看到這個方法的定義的時候就一目了然了:這個方法可能會出現(xiàn)什么異常

為什么 RuntimeException 不強制 try-catch

那為什么RuntimeException不強制try-catch呢?

因為很多的RuntimeException都是因為程序的BUG而產(chǎn)生的

比如我們調(diào)用Integer.parseInt("A")會拋出NumberFormatException

當我們的代碼中出現(xiàn)了這個異常,那么我們就需要修復(fù)這個異常

當我們修復(fù)了這個異常之后,就不會再拋出這個異常了,所以try-catch就沒有必要了

當然像下面這種代碼除外

public boolean isInteger(String s) {
    try {
        Integer.parseInt(s);
        return true;
    } catch (NumberFormatException e) {
        return false;
    }
}

這是我們利用這個異常來達成我們的需求,是有意為之的

而另外一些異常是屬于沒辦法用代碼解決的異常,比如IOException

我們在進行網(wǎng)絡(luò)請求的時候就有可能拋出這類異常

因為網(wǎng)絡(luò)可能會出現(xiàn)不穩(wěn)定的情況,而我們對這個情況是無法干預(yù)的

所以我們需要提前考慮各種突發(fā)情況

強制try-catch相當于間接的保證了程序的健壯性

畢竟我們平時寫代碼,如果IDE沒有提示異常處理,我們完全不會認為這個方法會拋出異常

我的代碼怎么可能有問題!

看來JAVA之父完全預(yù)判到了程序員的腦回路

throws 和 throw 的區(qū)別

java中還有一個關(guān)鍵詞throw,和throws只有一個s的差別

throw是用來主動拋出一個異常

public class ThrowsDemo {

    public void demo4throws() throws RuntimeException {
        throw new RuntimeException();
    }
}

兩者完全是不同的功能,大家不要弄錯了

什么場景用 throws

我們可以發(fā)現(xiàn)我們平時寫代碼的時候其實很少使用throws

因為當我們在開發(fā)業(yè)務(wù)的時候,所有的分支都已經(jīng)確定了

比如網(wǎng)絡(luò)請求出現(xiàn)異常的時候,我們常用的方式可能是打印日志,或是進行重試,把異常往外拋等等

所以我們沒有那么有必要去使用throws這個關(guān)鍵字來說明異常信息

但是當我們沒有辦法確定異常要怎么處理的時候呢?

比如我在GitHub上維護了一個功能庫,本身沒有什么業(yè)務(wù)屬性,主要就是對于一些復(fù)雜的功能做了相應(yīng)的封裝,提供給自己或別人使用

對我來說,當我的方法中出現(xiàn)異常時,我是不清楚調(diào)用這個方法的人是想要怎么處理的

可能有的想要重試,有的想要打印日志,那么我干脆就往外拋,讓調(diào)用方法的人自己去考慮,自己去處理

所以簡單來說,如果方法主要是給別人用的最好用throws把異常往外拋,反之就是可加可不加

結(jié)束

很多時候你的不理解只是因為你還不夠了解

分享到:
標簽:Java
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定