Aは、変数でNullPointerException
を使用しようとしたときに発生します。例えば:.
null
String s = null;
char c = s.charAt(0); // Tries to access null, throws NPE
発生する可能性のあるもう1つの場所は、ラッパーNullPointerException
を開梱しようとしたときです。null
Integer integer = null;
int i = integer; // Tries to unbox null, throws NPE
これらはあなたが今までに得ることができる唯一の方法ですNullPointerException
。まあ、誰かが明示的に1つを投げない限り:
throw new NullPointerException();
しかし、決してそうすべきではありません。代わりに投げIllegalArgumentException
ます。
そうは言っても、メソッドから戻っても。null
は生成されませんNullPointerException
。ただし、そのメソッドが返されるときにそのメソッドの結果を使用すると、.
次のことが可能になります。null
Map<Integer, Animal> map = method();
map.get(20); // Throws NPE if method() returns null
これを修正するには、null
-checkを使用します。
Map<Integer, Animal> map = method();
if (map != null)
map.get(20); // Never throws NPE
引き続き参照map
として使用できますが、であるためアクセスできないことに注意してください。それはあなたが見逃しているように見える違いです。null
コメントを編集する
method()
それで、あなたは私が(例外処理なしで)そのままにして、呼び出し元の関数からそれをチェックするべきだと提案していますか?
それは1つの可能なオプションです。もう1つは、例外をスローして、null
そうではない場合であることを示します。
大きな問題は、それが可能null
かどうかということです。そうである場合は、そのままにして、上記のように呼び出すときにmethod()
それが正しいかどうかを確認します。null
このメソッドがを返す可能性があることをJavadocコメントで示しますnull
。
を返すことが許可されていない場合null
は、メソッドが呼び出されたときに、を作成するMap
か、例外をスローします。次の場合にのみマップを作成することもできますnull
(これはレイジー初期化と呼ばれます)。
public Map<Integer, Animal> method() {
if (hashMap == null)
hashMap = new HashMap<Integer, Animal>();
return hashMap;
}
自分hashMap
が別の場所で作成されている場合は、他の場所で作成されるまでこのメソッドを呼び出さないでください(前提条件と呼ばれます)。その後、例外をスローする必要があります。前提条件違反の場合、私は通常以下を使用しますIllegalStateException
:
public Map<Integer, Animal> method() {
if (hashMap == null)
throw new IllegalStateException("Must call otherMethod() to initialize hashMap before calling this method.");
return hashMap;
}