Javaコレクション処理/Null値処理/例外処理、使用心得共有!

5060 ワード

1. Arrays.asList
ビジネス開発では、元の配列をListクラスのデータ構造に変換して、さまざまなStream操作を継続することがよくあります.
  • Arrays.asListは基本タイプの配列を変換することができず、Arraysを使用することができる.streamによる変換
  • Arrays.asListが返すリストは削除操作をサポートしておらず,その返すリストはArraysの内部クラスArrayListである.内部はAbstractListから継承され、親を上書きするaddメソッド
  • はありません.
  • 元の配列の修正は、私たちが得たリストに影響します.
  • ArrayListは実際には元の配列を使用しているので、使用する場合はNew ArrayListを使用してデカップリング
  • を実現することが望ましい

    2.NULL処理
    2.1 NullPointerException
  • 可能なシーン
  • パラメータ値はIntegerなどのパッケージタイプで、使用時に自動解体で空ポインタ異常が発生した
  • 文字列比較
  • ConcurrentHashMapこのような容器はKeyとValueがnullであることをサポートしておらず、put nullを強行するkeyまたはValueに空のポインタ異常が発生する
  • メソッドまたはリモート・サービスが返すリストはnullであり、空を判別せずに直接呼び出し、空ポインタ異常
  • が発生する
  • カスケード呼び出しnull check
  • best practice
  • string.equalsTo(variableName)
  • Optional.ofNullable()
  • orElse()


  • 3.異常処理
    3.1業務コードの面で異常処理を考慮する
  • ほとんどのビジネスアプリケーションでは、3階層アーキテクチャが採用されています.
  • Controllerレイヤ
  • 情報収集、パラメータ検証、変換サービス層処理のデータ適合フロントエンド、軽業務ロジック
  • Controllerは異常をキャプチャし、ユーザーに友好的なユーザーへのヒントを与える必要がある
  • Service層
  • 外部サービス呼び出し、データベースへのアクセス、キャッシュ処理、メッセージ処理などを含むコアビジネスロジックを担当
  • 一般的にはデータベース・トランザクションに関連し、例外が発生した場合は取得に適していません.そうしないと、トランザクションは自動的にロールバックできません
  • Repositoryレイヤ
  • データアクセスの実現を担当し、一般的にビジネスロジック
  • 状況に応じて無視、降格、または友好的な異常に変換

  • フレームレベルの異常処理
  • フレームレベルで異常な自動化をしないように、統一的な処理
  • フレームワークは底辺の仕事をしなければならない.もし異常が最上位の論理に上昇しても処理できないならば、統一的な方法で異常変換を行うことができる.
  • @RestControllerAdvice
  • @ExceptionHandler



  • 3.2異常を直接飲み込まない
    異常を捕獲した後は生で飲み込むべきではなく、飲み込んだ異常が正常に処理されていなければBugが現れるのは発見しにくいからです.
    適切なユーザーフレンドリーな異常に変換するか、少なくともwarn、errorレベルでlogを行う必要があります.
    3.3元の情報を保持する
    異常を捉えた後は、logや外に投げ出された異常に元の異常情報を記録することを忘れないでください.
    catch (IOException e) {
        //        ,     
        log.error("      , {}", e.getMessage());
        throw new RuntimeException("        ");
    }
    
    
    catch (IOException e) {
        throw new RuntimeException("        ", e);
    }123456789

    また、公衆番号Java技術スタックに注目し、バックグラウンドで「面接」と返事し、私が整理したJavaシリーズの面接問題と答えを得ることができ、非常にそろっています.
    3.4注意finallyの異常+try with resources
    注意リソース解放処理などのエンドオペレーションでも異常が発生する可能性があります.この場合、try blockロジックとfinnallyロジックに異常が投げ出されると、try中の異常がfinnally中の異常に覆われ、問題が非常に明らかになりません.
    @GetMapping("wrong")
    public void wrong() {
        try {
            log.info("try");
            //    
            throw new RuntimeException("try");
        } finally {
            log.info("finally");
            throw new RuntimeException("finally");
        }
    }12345678910

    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();
    }
    123456789101112131415161718192021

    3.5スレッドプールタスクの例外処理
    スレッドプールを宣言するときにスレッドプールをカスタマイズする未取得例外ハンドラなど、カスタム例外ハンドラをベースに設定します.
    new ThreadFactoryBuilder()
      .setNameFormat(prefix+"%d")
      .setUncaughtExceptionHandler((thread, throwable)-> log.error("ThreadPool {} got exception", thread, throwable))
      .get()1234

    最後に、公衆番号Java技術スタックに注目して、バックグラウンドで返事します:面接、私が整理したJavaシリーズの面接問題と答えを得ることができて、とてもそろっています.
    Reference
  • https://www.baeldung.com/java...
  • https://time.geekbang.org/col...

  • 最近のホット文書の推奨:
    1. 600+道Java面接問題及び解答整理(2021最新版)
    2. やっとオープンソースプロジェクトでIntelliJ IDEAアクティブコードを手に入れました。いい香りですね。
    3. アリMockツールは正式にオープンし、市販のすべてのMockツールを乾かします!
    4. Spring Cloud 2020.0.0が正式にリリースされ、新しい転覆バージョンがリリースされました!
    5. 『Java開発マニュアル(嵩山版)』最新リリース、速速速ダウンロード!
    いいと思います.いいね+転送を忘れないでください.