Javaでnullポインタ例外を処理する方法
NullPointerException は、Java コードで最も一般的な例外です。私は、その最も可能性の高いシナリオを次の 5 つのタイプに分類します:
パラメータ値は、Integer などのパッケージ化タイプです。自動アンボックス化中に null ポインター例外が発生しました;
文字列比較中に null ポインター例外が発生しました;
ConcurrentHashMap などのコンテナーは、 Key と Value が null をサポートしていないため、null Key または Value を強制的に配置すると null ポインタ例外が発生します;
A オブジェクトには B が含まれています。オブジェクト、フィールドは空とは判断されません。B のメソッドをカスケードで呼び出すと null ポインタ例外が発生します。メソッドまたはリモート サービスから返される List は空ではなく null で、List を直接呼び出すと null ポインタ例外が発生します。 null チェックを実行せずにメソッドを実行します。
private List<String> wrongMethod(FooService fooService, Integer i, String s, String t) { log.info("result {} {} {} {}", i + 1, s.equals("OK"), s.equals(t), new ConcurrentHashMap<String, String>().put(null, null)); if (fooService.getBarService().bar().equals("OK")) log.info("OK"); return null; } @GetMapping("wrong") public int wrong(@RequestParam(value = "test", defaultValue = "1111") String test) { return wrongMethod(test.charAt(0) == '1' ? null : new FooService(), test.charAt(1) == '1' ? null : 1, test.charAt(2) == '1' ? null : "OK", test.charAt(3) == '1' ? null : "OK").size(); } class FooService { @Getter private BarService barService; } class BarService { String bar() { return "OK"; } }
修復のアイデアは次のとおりです:
Integer の null 判定の場合、Optional.ofNullable を使用して Optional、 orElse(0 ) を使用します。 null をデフォルト値に置き換えて、1 つの操作を実行します。文字列とリテラルの比較では、"OK".equals(s) のようにリテラルを先頭に置くことができるため、s が null の場合でも null ポインタ例外は発生しません。 null 等しい比較には、null 処理を実行する Objects.equals を使用できます。
ConcurrentHashMap の場合、Key も Value も null をサポートしていないため、修正方法は null を格納しないことです。 HashMap の Key と Value は null を格納できますが、ConcurrentHashMap は HashMap のスレッドセーフ版のようですが、null 値の Key と Value をサポートしていないため、この点で誤解が生じやすいところです。
fooService.getBarService().bar().equals("OK") のようなカスケード呼び出しでは、fooService メソッドや getBarService() メソッドなど、null 判定が必要な場所が数多くあります。の戻り値、および bar メソッドによって返される文字列。 if-else を使用して null をチェックする場合は、数行のコードが必要になる場合がありますが、Optional を使用する場合は 1 行のコードで十分です。
rightMethod で返される List については、null かどうか確認できないため、size メソッドを呼び出してリストのサイズを取得する前に、Optional.ofNullable を使用してラップすることもできます。 orElse(Collections.emptyList()) は、List が null の場合に空の List を取得し、最後に size メソッドを呼び出します。
private List<String> rightMethod(FooService fooService, Integer i, String s, String t) { log.info("result {} {} {} {}", Optional.ofNullable(i).orElse(0) + 1, "OK".equals(s), Objects.equals(s, t), new HashMap<String, String>().put(null, null)); Optional.ofNullable(fooService) .map(FooService::getBarService) .filter(barService -> "OK".equals(barService.bar())) .ifPresent(result -> log.info("OK")); return new ArrayList<>(); } @GetMapping("right") public int right(@RequestParam(value = "test", defaultValue = "1111") String test) { return Optional.ofNullable(rightMethod(test.charAt(0) == '1' ? null : new FooService(), test.charAt(1) == '1' ? null : 1, test.charAt(2) == '1' ? null : "OK", test.charAt(3) == '1' ? null : "OK")) .orElse(Collections.emptyList()).size(); }
ビジネス ニーズに応じて、名前、年齢、ニックネームをそれぞれ更新します。名前については、クライアントが名前を null にリセットしたいと考えていると考えられます。 null. を渡すと、このような操作が可能になり、Optional の orElse メソッドを使用して、ワンクリックで null を空の文字列に変換します。
年齢については、クライアントが年齢を更新したい場合は、有効な年齢を渡す必要があると考えられます。年齢のリセット操作はありません。次の場合は、オプションの orElseThrow メソッドを使用できます。値が空の場合、IllegalArgumentException がスローされます。
ニックネームについては、データベース内の名前を null にすることはできないため、ゲストにデータベースから取得した名前を加えたものをニックネームに安全に設定できます。
以上がJavaでnullポインタ例外を処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

Java は、初心者と経験豊富な開発者の両方が学習できる人気のあるプログラミング言語です。このチュートリアルは基本的な概念から始まり、高度なトピックに進みます。 Java Development Kit をインストールしたら、簡単な「Hello, World!」プログラムを作成してプログラミングを練習できます。コードを理解したら、コマンド プロンプトを使用してプログラムをコンパイルして実行すると、コンソールに「Hello, World!」と出力されます。 Java の学習はプログラミングの旅の始まりであり、習熟が深まるにつれて、より複雑なアプリケーションを作成できるようになります。
