[解決済み] Boolean.valueOf()でNullPointerExceptionが発生することがある。
2022-05-18 02:56:14
質問
このようなコードがあります。
package tests;
import java.util.Hashtable;
public class Tests {
public static void main(String[] args) {
Hashtable<String, Boolean> modifiedItems = new Hashtable<String, Boolean>();
System.out.println("TEST 1");
System.out.println(modifiedItems.get("item1")); // Prints null
System.out.println("TEST 2");
System.out.println(modifiedItems.get("item1") == null); // Prints true
System.out.println("TEST 3");
System.out.println(Boolean.valueOf(null)); // Prints false
System.out.println("TEST 4");
System.out.println(Boolean.valueOf(modifiedItems.get("item1"))); // Produces NullPointerException
System.out.println("FINISHED!"); // Never executed
}
}
私の問題は、なぜ
テスト 3
は正常に動作しています (それは
false
を出力し
NullPointerException
を生成しない)一方
テスト4
を投げる。
NullPointerException
. テストを見ればわかるように
1
と
2
,
null
と
modifiedItems.get("item1")
はイコールであり
null
.
Java 7と8で動作は同じです。
どのように解決するのですか?
どのオーバーロードが呼び出されるかを注意深く見る必要があります。
-
Boolean.valueOf(null)
はBoolean.valueOf(String)
. これはNPE
を投げません。 -
Boolean.valueOf(modifiedItems.get("item1"))
はBoolean.valueOf(boolean)
というのはmodifiedItems
の値はBoolean
であり,アンボクシングの変換が必要である。このためmodifiedItems.get("item1")
はnull
であるならば、その値のアンボックスである。Boolean.valueOf(...)
- ではなく、その値のアンボックスであり、NPEをスローします。
どのオーバーロードが呼び出されるかを決定するためのルールは かなり毛深い ですが、おおよそ次のようなものです。
-
最初のパスでは、ボックス化/アンボックス化(可変アリティメソッドも)を許可せずに、メソッドのマッチングを検索します。
-
なぜなら
null
は許容される値でありString
は許容範囲ですがboolean
,Boolean.valueOf(null)
にマッチするのはBoolean.valueOf(String)
にマッチします。 -
Boolean
はどちらも許容範囲外です。Boolean.valueOf(String)
またはBoolean.valueOf(boolean)
であるため、このパスではどのメソッドにもマッチしません。Boolean.valueOf(modifiedItems.get("item1"))
.
-
なぜなら
-
2 番目のパスでは、メソッドの一致が検索され、ボックス化/アンボックス化が可能になります (ただし、可変アリティのメソッドはまだできません)。
-
A
Boolean
はボックスが解除されboolean
というようにBoolean.valueOf(boolean)
にマッチするのはBoolean.valueOf(modifiedItems.get("item1"))
にマッチします。しかし、これを呼び出すには、コンパイラによって 箱詰め解除の変換が挿入されなければなりません。Boolean.valueOf(modifiedItems.get("item1").booleanValue())
-
A
-
(可変アリティメソッドを許可する3つ目のパスがありますが、最初の2つのパスがこれらのケースにマッチしているので、ここでは関係ありません)
関連
-
mvn' は、内部または外部のコマンド、操作可能なプログラムまたはバッチファイルとして認識されません。
-
java.sql.SQLException: executeQuery()でデータ操作文を発行できません。
-
Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
-
Javaジェネリックを1つの記事で
-
Java appears タイプEを囲むインスタンスがアクセスできない。
-
ecplise プロンプトが表示されます。"選択したものは起動できません。" "最近の起動はありません。"
-
Java:未解決コンパイル問題の解決方法
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaでのNullPointerException(StackTraceなし
-
[解決済み】Collectors.toMapでNullPointerExceptionが発生する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
XMLファイル操作時のjava.util.NoSuchElementExceptionを解決する方法。
-
Collections.sortがdoubleでソートできない問題を完璧に解決する。
-
Javaクラスが "Error occurred during initialization of boot layer "というエラーで実行される。
-
ajax コミット リソースの読み込みに失敗しました: サーバーはステータス 400 で応答しました ()
-
JAVA_HOME環境変数が正しく定義されていない問題を解決する
-
java マイクロソフト払い戻し予期せぬサーバーからのファイルの終了
-
Web Project JavaでPropertiesファイルを読み込むと、「指定されたファイルがシステムで見つかりません」というソリューションが表示されます。
-
Java の double データ型における 0.0 と -0.0 の問題
-
1分でわかる!恋人の写真をIDEAの背景画像に設定する方法【おすすめ集
-
CAS 5.1.8でhttpをサポートし、認証されていない認可サービスエラーのプロンプトが表示される問題を解決した。