1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Java 集合處理/ 空值處理/ 異常處理,使用心得分享!

        共 2886字,需瀏覽 6分鐘

         ·

        2021-01-28 11:12

        Java技術(shù)棧

        www.javastack.cn

        關(guān)注閱讀更多優(yōu)質(zhì)文章



        1. Arrays.asList

        業(yè)務(wù)開發(fā)當中,我們常常會將原始的數(shù)組轉(zhuǎn)換為List類數(shù)據(jù)結(jié)構(gòu),來繼續(xù)展開各種Stream操作

        2. 空值處理

        2.1 NullPointerException

        • 可能出現(xiàn)的場景

          • 參數(shù)值是Integer等包裝類型,使用時因為自動拆箱出現(xiàn)了空指針異常
          • 字符串比較
          • ConcurrentHashMap這種容器不支持Key和Value為null,強行put null的key或Value會出現(xiàn)空指針異常
          • 方法或遠程服務(wù)返回的list是null,沒做判空就直接調(diào)用,出現(xiàn)空指針異常
          • 聯(lián)級調(diào)用的null check
        • best practice

          • string.equalsTo(variableName)
          • Optional.ofNullable()
          • orElse()

        3. 異常處理

        3.1 在業(yè)務(wù)代碼層面考慮異常處理

        • 大多數(shù)業(yè)務(wù)應用都采用三層架構(gòu)
          • 負責數(shù)據(jù)訪問實現(xiàn),一般沒有業(yè)務(wù)邏輯
          • 根據(jù)情況來做忽略,降級,或者轉(zhuǎn)化為一個友好的異常
          • 負責核心業(yè)務(wù)邏輯,包括外部服務(wù)調(diào)用,訪問數(shù)據(jù)庫,緩存處理,消息處理等
          • 一般會涉及到數(shù)據(jù)庫事務(wù),出現(xiàn)異常不適合捕獲,否則事務(wù)無法自動回滾
          • 負責信息收集,參數(shù)校驗,轉(zhuǎn)換服務(wù)層處理的數(shù)據(jù)適配前端,輕業(yè)務(wù)邏輯
          • Controller 捕獲異常,然后需要給用戶友好用戶的提示
          • Controller層
          • Service層
          • Repository層
        • 框架層面的異常處理
          • @RestControllerAdvice
          • @ExceptionHandler
          • 盡量不要在框架層面做異常的自動,統(tǒng)一的處理
          • 框架應當來做兜底工作,如果異常上升到最上層邏輯還是無法處理的話,可以用統(tǒng)一的方式進行異常轉(zhuǎn)換

        3.2 不要直接生吞異常

        捕獲了異常以后不應該生吞,因為吞掉的異常如果沒有正常處理的話,出現(xiàn)Bug會很難發(fā)現(xiàn)。

        需要有合適的轉(zhuǎn)化成用戶友好的異常,或者至少在warn, error級別來做log。

        推薦閱讀:10 個深惡痛絕的 Java 異常。

        3.3 保留原始的信息

        在捕捉了異常之后,一定要記得在log 或者在向外扔出的異常之中記錄原始異常信息

        catch?(IOException?e)?{
        ????//只保留了異常消息,棧沒有記錄
        ????log.error("文件讀取錯誤,?{}",?e.getMessage());
        ????throw?new?RuntimeException("系統(tǒng)忙請稍后再試");
        }


        catch?(IOException?e)?{
        ????throw?new?RuntimeException("系統(tǒng)忙請稍后再試",?e);
        }

        另外,關(guān)注公眾號Java技術(shù)棧,在后臺回復:面試,可以獲取我整理的 Java 系列面試題和答案,非常齊全。

        3.4 小心finally中的異常 + try with resources

        注意在資源釋放處理等收尾操作的時候也可能會出現(xiàn)異常,這種時候,如果try block邏輯和finnally邏輯都有異常拋出的話,try當中的異常會被finnally中的異常覆蓋掉,這會讓問題變得非常不明顯。

        推薦閱讀:你還在使用 try-catch-finally 關(guān)閉資源?

        @GetMapping("wrong")
        public?void?wrong()?{
        ????try?{
        ????????log.info("try");
        ????????//異常丟失
        ????????throw?new?RuntimeException("try");
        ????}?finally?{
        ????????log.info("finally");
        ????????throw?new?RuntimeException("finally");
        ????}
        }

        對于實現(xiàn)了AutoCloseable接口的資源,可以使用try-with-resources來釋放資源,就是在try中帶資源的聲明。

        try catch finally vs try with resources

        Scanner?scanner?=?null;
        try?{
        ????scanner?=?new?Scanner(new?File("test.txt"));
        ????while?(scanner.hasNext())?{
        ????????System.out.println(scanner.nextLine());
        ????}
        }?catch?(FileNotFoundException?e)?{
        ????e.printStackTrace();
        }?finally?{
        ????if?(scanner?!=?null)?{
        ????????scanner.close();
        ????}
        }

        try?(Scanner?scanner?=?new?Scanner(new?File("test.txt")))?{
        ????while?(scanner.hasNext())?{
        ????????System.out.println(scanner.nextLine());
        ????}
        }?catch?(FileNotFoundException?fnfe)?{
        ????fnfe.printStackTrace();
        }

        3.5 線程池任務(wù)的異常處理

        設(shè)置自定義的異常處理程序作為保底,比如在聲明線程池時自定義線程池的未捕獲異常處理程序:

        new?ThreadFactoryBuilder()
        ??.setNameFormat(prefix+"%d")
        ??.setUncaughtExceptionHandler((thread,?throwable)->?log.error("ThreadPool?{}?got?exception",?thread,?throwable))
        ??.get()

        最后,關(guān)注公眾號Java技術(shù)棧,在后臺回復:面試,可以獲取我整理的 Java 系列面試題和答案,非常齊全。

        Reference

        1. https://www.baeldung.com/java-try-with-resources
        2. https://time.geekbang.org/column/article/220230






        關(guān)注Java技術(shù)??锤喔韶?/strong>



        戳原文,獲取精選面試題!
        瀏覽 26
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

          <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            91视频在线国产 | 日韩小穴 | 99热思思热 | 国产做a爱一级毛片久久 | 大香蕉视频网 | 超碰在线97免费 | 男同被到爽漫画软件 | 色情大片AAAAAA视频人与 | 国产aaaaaa | 精品国产乱码久久久久久中文 |