2016-09-26 13 views
3

以下は私の問題の図です。現在のところ、NullPointerExceptionをどのように処理するかはわかりません。ユニットテスト中にNullPointerException(関数またはコンストラクタ内)を処理する場所

public class Util 
{ 
    private Map<Integer, String> myMap; 

    public Util(Map<Integer, String> myMap) 
    { 
    this.myMap = myMap; 
    } 

    public String getVal(Integer region) 
    { 
    return myMap.get(region); 
    } 
} 


public class UtilTest { 

    @Test 
    public void testNull() throws Exception{ 
    Map<Integer, String> myMap = null; 
    Util util = new Util(myMap); 

    util.getValue(1); 
    } 
} 

上記のコードは、期待どおりにNullPointerExceptionを返します。私の関心は、私は、コンストラクタまたは関数自体

機能で

public Util(Map<Integer, String> myMap) 
    { 
    if(myMap != null) 
    this.myMap = myMap; 
    else 
    this.myMap = new Map<>(); 
    } 

を次のようにコンストラクタになり、それは似たものになるだろうと

public String getVal(Integer region) 
{ 
    if(myMap != null) 
    return myMap.get(region); 
    else 
    return ""; 
} 
で、それを処理しなければならないところであります

これらのアプローチのどちらが優れていますか?

+0

この場合、一般的な「良い」ものはありません。そのコードをどのように動作させるかによって異なります。 –

+4

インスタンスをnull参照で作成するには、それを有効にしますか?その時点でそれはまったく役に立ちますか? (私はこれが本当にテストの質問であることは正直言ってわかりません。どのようにあなたのクラスが振る舞うかを決めると、あなたはそれを簡単に十分にテストできるはずです。) –

+0

それは必要に応じて異なります。 'Util'の目的は何ですか?マップの代わりに表現されるマップは何ですか?インスタンス内でnullになる可能性はありますか?あなたがUtilにヌルマップを持つことを受け入れるなら、セッターを持っていますか? (もしそうでなければ、あなたは最終的に置くことができる)。あなたがsetterを持っていない場合は、あなたが望むgetValueの結果は何ですか?例外をスローし、nullを返します。 nullpointerは常に期待に依存します。 – AxelH

答えて

9

Utilクラスの中に何が入るのかについては、外部の関数は理解できないはずなので、Utilクラスにあるはずです。無効/有効な値を送信できます。コンストラクタは、すべての無効/有効値を十分に考慮していることを確認する必要があります。

これは、Utilを作成するn個の場所がある場合は、すべてのn個の場所でこれをif-elseとする必要があります。それをコンストラクタでのみ持つ方がよいでしょう。

1

それは意見の問題です。 しかし、あなたはセッターメソッドを提供していないので、私はコンストラクターでそれを行うことを提案します。

セッターを後で提供する予定がある場合は、コンストラクターをチェックインせずに残しておいても問題ありません(入力がその時点で利用できない場合に備えて)。

最後に、nullがコードに有効な入力である可能性があり、システムがnullポインタをスローするのではなく、ゲッターメソッドで完全に細かくチェックし、例外をスローします。

私の考えは、setterがなければ、Constructorから例外をスローします。プログラムがヌルポインタを投げ込まないようにしてください。

0

私の意見はどこにもありません!

誰かがnew Util(null)を呼び出す場合、彼はどちらかです:

  • このクラスに関連テストコードを書き込み、彼はこれに依存しないクラスの別の部分をテストしているため、彼は明示的にnullを通過した男Mapですので、nullMapは決して呼び出されないため)を許可しても問題ありません。
  • 生産コードでこのクラスを使っている男、それが生産にnullを使うのは間違いなので、ちょうどコードは後でNPEを投げるとnullは結果(別名痛いデバッグを)感じる使うためにあえて男を聞かせてみましょう。
関連する問題