1

私には次のような方法があります。いくつかの計算を行ってから、HashMapを返します。

public Map<Integer, Animal> method() {
     // do some computation
     returns hashMap;
    }

1.)ハッシュマップが戻った場合null、nullポインタ例外が発生しますか?もしそうなら、私はそれを次のように扱う必要があります

public Map<Integer, Animal> method() throws{

呼び出し元のメソッドがそれを処理するように?

4

3 に答える 3

2

オブジェクトを取得したら、それがnullかどうかを確認します... null値が意図されていない場合は、それがaであり、すべてがどこにでもある可能性がNullPointerExceptionあるため、ドキュメントのためだけにスローする可能性があることを指定できます。RunTimeExceptionRuntimeExceptions

次のこともできます。

try{
    /* calculate */
}
catch(NullPointerException e){
    /* process exception */
}

発生時に処理するNullPointerExceptionため、アクションを元に戻したり、リソースを閉じたり、より説明的な例外をスローしたりできます...

例えば:

try{
    Type o = (Type) map.get(key);
    o.doSomething();
}
catch(NullPointerException e)
{
    throw new RuntimeException("Null values are not accepted!", e);
}
于 2012-12-06T16:36:44.617 に答える
1

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;
}
于 2012-12-06T16:35:32.913 に答える
1

いいえ、単に返すだけなので、null ポインター例外は発生しませんHashMap。返された操作を行う前にメソッドを呼び出すHashMapときは、返された値が null でないことを確認してください。

于 2012-12-06T16:34:02.803 に答える