欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

怎么在Java8中處理異常-創(chuàng)新互聯(lián)

本篇內(nèi)容介紹了“怎么在Java8中處理異常”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

我們提供的服務(wù)有:成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、廣陵ssl等。為成百上千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的廣陵網(wǎng)站制作公司

我們都知道,Java 異常分為檢查異常和非檢查異常。檢查異常就是編譯器要求開(kāi)發(fā)者必須處理的異常,而非檢查異常則沒(méi)有這個(gè)要求。所以當(dāng)我們需要調(diào)用某個(gè)拋出檢查異常的方法時(shí),必須明確捕獲它:

myList.stream()
  .map(item  ->
      try{
        return doSomething(item);
      } catch(MyException e){
        throw new RuntimeException (e);
      }
    })
    .forEach(System.out::printion);

如上面代碼所示,我們捕獲了 MyException 這個(gè)檢查異常,然后將其轉(zhuǎn)化為 RuntimeException 非檢查異常,重新拋出。但是你自己心里面其實(shí)清楚的很,這不是最好的處理方式。

優(yōu)化一: 提升可讀性

如下所示,我們將方法體單獨(dú)提取到 trySomething 方法中,這樣的話,我們就可以使用一行代碼完成 lambda 表達(dá)式,整個(gè)代碼可讀性也會(huì)提升不少:

myList.stream()
  .map(this::trySomething)
  .forEach(System.out::printion);
private Item trySomething(Item item) {
   try{
     return doSomething(item);
   } catch(MyException e){
     throw new RuntimeException (e);
   }
}
優(yōu)化二: 復(fù)用代碼

現(xiàn)在你已經(jīng)解決了上述的問(wèn)題,然而當(dāng)我們?cè)倥龅叫枰幚懋惓5钠渌椒〞r(shí),難道我們都要用 try ... catch ... 包裹一層嗎?那樣的話,你可以想象代碼中可能到處都是這種類似的寫(xiě)法。為了避免陷入到這種重復(fù)的寫(xiě)法中,我們應(yīng)該將上述代碼片段抽象為一個(gè)小的工具類,專門用來(lái)干這件事情。你只需要定義一次,然后再需要的地方多次調(diào)用它就可以了。

為了實(shí)現(xiàn)這個(gè)目標(biāo),我們首先需要自己定義一個(gè)函數(shù)式接口,這個(gè)接口可能會(huì)拋出一個(gè)異常:

然后,我們來(lái)寫(xiě)一個(gè)靜態(tài)幫助函數(shù) wrap ,該方法接受一個(gè)函數(shù)式接口參數(shù),在方法體內(nèi)捕獲檢查異常,并拋出非檢查異常 RuntimeException:

借助于 wrap 靜態(tài)函數(shù),現(xiàn)在你可以在 lambda 表達(dá)式中這么寫(xiě)了

優(yōu)化三: 出現(xiàn)異常時(shí)繼續(xù)運(yùn)行

上述代碼的可讀性、抽象性已經(jīng)很好了,然而還存在一個(gè)比較大的問(wèn)題,那就是當(dāng)出現(xiàn)異常的時(shí)候,你的 stream 代碼會(huì)立即停止,不會(huì)接著處理下一個(gè)元素。大多數(shù)情況下,當(dāng)拋出異常的時(shí)候,我們可能還想讓 stream 繼續(xù)運(yùn)行下去。

我們與其拋出異常,將異常當(dāng)成一種特殊的情況處理,還不如直接將異常當(dāng)成是一個(gè) “正常” 的返回值。即這個(gè)函數(shù)要么返回一個(gè)正確的結(jié)果,要么返回一個(gè)異常,所以我們現(xiàn)在需要定義一個(gè)新的封裝類 Either,用來(lái)存儲(chǔ)這兩種結(jié)果。為了方便,我們將異常存儲(chǔ)到 left 這個(gè)字段中,將正常返回的值存儲(chǔ)到 right 這個(gè)字段中。下面就是 Either 類的一個(gè)簡(jiǎn)單示例:

public class Eithercl<L,R>{
     private final L Left:
     private final R right;
     private Either(L left, R right){
         this left=left;
         this right =right;
}
public static <L, R> Either,<L,R> Left( L value) {
    return new Either(value, null):
}
public static <L, R> Either<L, R> Right( R value) {
    return new Either(null, value)
}
public Optional<L> getleft() {
    return Optional. ofnullable(left)
}
public Optional<R> getright() {
    return Optional.ofnullable(right);
}
public boolean isleft() {
    return left I- null;
}
public boolean isright(){
    return right != null;
}
public < T> optional<T> mapleft(Function<? super L, T> mapper){
    if (isleft()) {
        return Optional of(mapper. apply(left));
     }
     return Optional empty();
}
public <T> Optional<T> mapright(Function<? super R, T> mapper) {
    if (isright()) {
         return Optional of(mapper. apply(right));
    }
    return Optionalempty();
}
public String tostring(){
    if (isleft()){
        return"Left(”+left+")";
    }
    return "Right("+ right +")";
  } 
}

現(xiàn)在我們需要再定義一個(gè) lift 函數(shù),該函數(shù)內(nèi)部將 function 函數(shù)正常返回的值或者拋出的異常都使用 Either 類進(jìn)行了一層封裝

現(xiàn)在我們的代碼變成這個(gè)樣子了,也不用擔(dān)心方法拋出異常會(huì)提前終止 Stream 了

優(yōu)化四: 保留原始值

現(xiàn)在思考一個(gè)問(wèn)題,如果在上述處理過(guò)程中,當(dāng)結(jié)果是異常信息的時(shí)候,我們想要重試,即重新調(diào)用這個(gè)方法怎么辦? 你會(huì)發(fā)現(xiàn)我們 Either 封裝類沒(méi)有保存最原始的這個(gè)值,我們丟掉了原始值,因此我們可以進(jìn)一步優(yōu)化,將原始值 t 也封裝進(jìn) left 字段中,就像下面這樣:

Pair 類是一個(gè)非常簡(jiǎn)單的封裝類,用以封裝兩個(gè)值:

public class Pair<F, S> {
    public final F fst;
    public final S snd;
    private Pair(F fst, S snd){
         this fst fst;
         this snd= snd;
    }
public static <F, S> Pair<F, S> of(F fst, S snd){
    return new Pair<>(fst, snd);
    }
}

這樣,當(dāng)我們遇見(jiàn)異常的時(shí)候,我們可以從 Pair 中取出最原始的值 t,無(wú)論是想重試,還是做一些其他操作,都很方便了。

“怎么在Java8中處理異常”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

網(wǎng)站標(biāo)題:怎么在Java8中處理異常-創(chuàng)新互聯(lián)
當(dāng)前地址:http://www.chinadenli.net/article32/disosc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作外貿(mào)網(wǎng)站建設(shè)網(wǎng)站內(nèi)鏈搜索引擎優(yōu)化Google定制開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)