int num = integer.getinteger(“ 123”)がnullpointerexceptionを投げるのはなぜですか?
-
30-09-2019 - |
質問
次のコードがスローします NullPointerException
:
int num = Integer.getInteger("123");
私のコンパイラが呼び出されています getInteger
nullは静的なので?それは意味がありません!
何が起こっていますか?
解決
大きな絵
ここには2つの問題があります:
Integer getInteger(String)
あなたがそれがすると思うことをしません- それは戻ってきます
null
この場合
- それは戻ってきます
- からの割り当て
Integer
にint
自動不動産を引き起こします- 以来
Integer
はnull
,NullPointerException
投げられます
- 以来
パースします (String) "123"
に (int) 123
, 、EGを使用できます int Integer.parseInt(String)
.
参照
Integer
API参照
の上 Integer.getInteger
この方法についてドキュメントが言わなければならないことは次のとおりです。
public static Integer getInteger(String nm)
: :指定された名前でシステムプロパティの整数値を決定します。指定された名前のプロパティがない場合、指定された名前が空またはnull
, 、またはプロパティに正しい数値形式がない場合は、null
返されます。
言い換えれば、この方法は、 String
に int/Integer
価値ですが、むしろ、それは System.getProperty
方法。
確かに、これは非常に驚きかもしれません。ライブラリがこのような驚きを持っているのは残念ですが、貴重な教訓を教えてくれます。常にドキュメントを調べて、方法が何をするかを確認してください。
偶然にも、この問題のバリエーションが紹介されました パズルの帰還:シュロックとa敬の念(TS-5186), 、Josh BlochとNeal Gafterの2009年のJavaoneテクニカルセッションプレゼンテーション。これが最後のスライドです:
道徳
- 奇妙でひどい方法図書館に潜んでいます
- 無害なサウンドの名前を持っている人もいます
- コードが不正行為をした場合
- 正しい方法を呼んでいることを確認してください
- ライブラリのドキュメントを読んでください
- APIデザイナー向け
- 最も驚きの原則に違反しないでください
- 抽象化階層に違反しないでください
- 非常に異なる動作に同様の名前を使用しないでください
完全性のために、これらの方法も類似しています Integer.getInteger
:
関連する質問
自動発信ボクシング
他の問題は、もちろん、 NullPointerException
投げられます。この問題に焦点を当てるために、次のようにスニペットを簡素化できます。
Integer someInteger = null;
int num = someInteger; // throws NullPointerException!!!
これは、効果的なJava 2nd Edition、項目49からの引用です。
要約すると、選択肢がある場合はいつでも、箱入りのプリミティブを好むプリミティブを使用してください。プリミティブタイプはよりシンプルで高速です。箱入りのプリミティブを使用する必要がある場合は、注意してください!自動ボクシングは、箱入りプリミティブを使用することの冗長性を低下させますが、危険ではありません。プログラムが2つの箱入りプリミティブを比較するとき
==
オペレーター、それはアイデンティティの比較を行いますが、これはほぼ間違いなくあなたが望むものではありません。プログラムがボックス化されたボックス化されていないプリミティブを含む混合タイプの計算を行うと、それはボックス化解除を行い、プログラムがボックス化されたとき、それは投げることができますNullPointerException
. 。最後に、プログラムがプリミティブ値をボックスにすると、コストがかかり、不必要なオブジェクトの作成が生じる可能性があります。
箱入りのプリミティブを使用する以外に選択肢がない場所があります。たとえば、ジェネリックですが、それ以外の場合は、箱入りのプリミティブを使用する決定が正当化されるかどうかを真剣に検討する必要があります。
関連する質問
他のヒント
から http://konigsberg.blogspot.com/2008/04/integergetinteger-are-you-kidding-me.html:
GetInteger '指定された名前を使用して、システムプロパティの整数値を決定します。
あなたはこれを求めている:
Integer.parseInt("123")
メソッドのドキュメントを確認してください getinteger()。この方法では、 String
パラメーターは、指定された名前を持つシステムプロパティの整数値を決定するシステムプロパティです。議論されているように、「123」はシステムプロパティの名前ではありません ここ。この文字列をに変換したい場合 int
, 、次に、メソッドを使用しますint num = Integer.parseInt("123")
.