<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          記一次線上環(huán)境空指針異常排查

          共 3275字,需瀏覽 7分鐘

           ·

          2021-07-08 10:47

          前言

          現(xiàn)在,很多小伙伴都在日常開發(fā)中使用lambda表達(dá)式,我也經(jīng)常用,我們線上環(huán)境的代碼更是廣泛使用,而且我之前還給大家分享過一些常用的lambda表達(dá)式,因?yàn)?code style="overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 100, 65);">lambda確實(shí)很好用,用起來也確實(shí)很方便,但是各位小伙伴在使用過程中一定要做好數(shù)據(jù)校驗(yàn),避免線上環(huán)境出現(xiàn)出現(xiàn)空指針異常,今天我們就來分享下我這一天排查線上環(huán)境發(fā)現(xiàn)的一個(gè)空指針異常(NPE),這個(gè)問題確確實(shí)實(shí)是那種你不遇到,你根本不知道的異常。話不多說,我們直接開始吧。

          問題分析

          我們先看這樣一段代碼:

          public static void main(String[] args) {
                  TestVo testVo = new TestVo();
                  List<TestVo> testVoList = Lists.newArrayList(testVo);
                  Map<String, Integer> collectMap = testVoList.stream().collect(Collectors.toMap(TestVo::getName, TestVo::getAge));
                  System.out.println(collectMap);
              }

          這段代碼沒有什么復(fù)雜的業(yè)務(wù)邏輯,咋看沒有任何問題,我當(dāng)初也是這么想的,但是經(jīng)過我的實(shí)際測(cè)試,以上代碼有兩處潛在的空指針異常。

          第一處大家應(yīng)該都可以看出來,就是testVoList為空的時(shí)候,所以在日常開發(fā)i中,如果是從數(shù)據(jù)庫查出來的list,一定要做空指針判斷;

          另一處我開始也沒看出來,直到我做了很多次測(cè)試以后,才發(fā)現(xiàn)這個(gè)隱藏的NPE。我們先說結(jié)論,toMap方法如果后一個(gè)參數(shù)(即TestVo::getAge,對(duì)應(yīng)我們map的值)為空,整個(gè)lambda就會(huì)報(bào)空指針異常:

          詳細(xì)分析異常,你會(huì)發(fā)現(xiàn),toMap方法在執(zhí)行過程中會(huì)調(diào)用merge方法,merge方法要求value不能為空:

          所以各位小伙伴在以后的開發(fā)中一定要盡可能避免這兩種空指針異常的出現(xiàn),對(duì)于第二種空指針可以通過下面這種方式避免:

          Map<String, Integer> collectMap = testVoList.stream().collect(Collectors.toMap(TestVo::getName,
                          t -> {
                              if (t.getAge() == null) {
                                  return 0;
                              } else {
                                  return t.getAge();
                              }
                          }));

          對(duì)于上面的代碼,如果把age的類型改成int,就不會(huì)報(bào)錯(cuò),因?yàn)榛绢愋?code style="overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 100, 65);">int的初始化是0。所以,這里其實(shí)還隱含了第三種空指針異常,包裝類轉(zhuǎn)基本類型的空指針異常。

          如果你的代碼中有,包裝類轉(zhuǎn)成基本類型的情況,請(qǐng)務(wù)必做好空指針判斷,否則也是會(huì)有空指針異常的,比如像像下面這段代碼:

          Integer a = null;
          int b = a;

          直接運(yùn)行,就是空指針異常:

          所以,各位小伙伴在使用基本類型與包裝類的時(shí)候,一定要盡可能保持類型一致,如果用包裝類就都用包裝類,非要做轉(zhuǎn)換的話,就務(wù)必做好數(shù)據(jù)校驗(yàn)。另外,由于基本類型和包裝類對(duì)java來說是兩種類型,所以下面的方法對(duì)java來說是兩個(gè)方法,也就是我們說的重載:

          private void testInt(Integer i) {
              System.out.println(i + i);
          }

          private void testInt(int i) {
              System.out.println(i * i);
          }

          但這種重載對(duì)調(diào)用方來說是極其不友好的,我在我們線上環(huán)境還真的遇到過,調(diào)用哪個(gè)方法取決你傳的是基本類型還是包裝類(誰在實(shí)際開發(fā)中會(huì)關(guān)注這個(gè)?),所以各位小伙伴一定要避免類似這種方法重載,這種代碼一旦出現(xiàn)問題,那就真的把你往死里坑。

          總結(jié)

          作為一個(gè)后端開發(fā)人員,減少NPE錯(cuò)誤是我們最基本的追求,所以各位小伙伴在實(shí)際開發(fā)過程中一定要盡可能避免,因?yàn)橐坏┌l(fā)生NPE異常,不僅對(duì)用戶交互不夠友好,排查問題也不方便,而且從個(gè)人角度來說,不論你能力有多強(qiáng),貢獻(xiàn)有多大,如果你開發(fā)的一個(gè)核心功能因?yàn)闆]有做數(shù)據(jù)校驗(yàn),最后導(dǎo)致NPE異常,影響系統(tǒng)正常運(yùn)行,那你怕要背上一個(gè)p1甚至p0工單,搞不好還會(huì)被開除,這樣你不覺得冤嗎?總之就是,日常開發(fā)過程中要盡一切可能避免NPE異常,不犯這種低級(jí)錯(cuò)誤,你的職場(chǎng)發(fā)展才能走的更順利。

          - END -


          瀏覽 39
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  精品人妻午夜一区二区三区四区 | 国产绿帽刺激高潮对白 | 亚洲成人无码在线 | 五月天在线高清无码 | www.啪 |