2017-05-13 7 views
2

こんにちは、これは私の最初の質問ですので、これは前にどこかで答えられていますが、ここにそれを掲示しています。整数または倍精度を返すときにキャッチの戻り値がtryの戻り値と異なることを確認する方法

メソッドの戻り値が正または負である場合、戻り値の範囲が不明な場合は、例外が発生した場合にどの値を返す必要がありますか?スコアおよび平均スコアを想定し

public double calculateDifference(String studentName, String quizName) { 
    try { 
     Quiz quiz = quizDAO.retrieve(quizName); 
     double averageScore = quiz.getAverageScore(); 
     Student student = quiz.getStudent(studentName); 
     double score = student.getScore(); 
     return score - averageScore; 
    } catch (NullPointerException e) { 
     return -1; 
    } 
} 

below-方法で例えば

は私のキャッチで私の戻り値は例外が存在しない場合に返される値に等しい何場合、大規模な範囲を持っていますか?

たとえば、スコア= 2、平均スコア= 3なので、戻り値として-1が得られます。

私はその戻り値を得ると、例外がキャッチされたかどうかわかりません。

他の可能な戻り値と衝突しないユニークなdouble値を返す方法があるかと思います。

+1

メソッドを呼び出す前にnull値をチェックする方が簡単かもしれません。 –

+0

@ patrick-hainge迅速な返信をありがとう、ありがとうございます。しかし、私はシーケンスダイアグラムに従わなければならない割り当てを行っているので、calculateDifferenceメソッドでgetStudentメソッドを呼び出すことしかできません。 –

答えて

2

シンプル:NullPointerExceptionsバグです。

あなたはそれらをキャッチしません。

原因を理解するためにデバッグし、問題を修正します。物語の終わり。

本当に巨大なアプリケーションを使用している場合、最上位レイヤーはRuntimeExceptionにキャッチすることができますが、その情報をログに記録してユーザーに役立つメッセージを表示するだけです。

はい、特定のRuntimeExceptionsがキャッチできます。たとえば、数字と思われる入力文字列を解析するときにNumberFormatExceptionが発生します。しかし、言ったように、-1を返すようにNPEを捕まえることは、単に間違っています。エラー状態を隠し、コードがそこからどのように続くかを予測することは不可能に近づきます。

具体的なケースでは、null引数を使用してメソッドを呼び出さないようにしてください。あなたが本当にヌル引数を渡すようにしたい場合は、あなたの方法(nullの場合もありますパラメータごとに1つのチェック)の最初の行で

Objects.requireNonNull(var, "var must not be null) 

のようなものを置くことができます。次に、nullを渡すと、メソッドがnpeをスローするようにすることが少なくとも明示的になります。

+0

ありがとう!その場合、クイズまたは学生がnullの場合、呼び出し元メソッドに例外を伝播するような何かを行うことはできますか?その後、そこからgetMessageを使用します。コンパイルして正常に動作します。 –

+0

おそらく私の最後の更新が役立ちます。しかし、私はあなたの質問を持っているかわからない。 – GhostCat

0

Effective Java本に従ってNullpointerExceptionをキャッチしないでください。これは通常プログラミングミスです。また、ここを参照してください:Should I always not catch NullPointerException?

私はどうなる

public double calculateDifference(String studentName, String quizName) 
{ 
    if (studentName == null || quizName == null){ 
     throw new IllegalArgumentException("Student name: " + studentName + ", quizName: " + quizName); 
    } 
    Quiz quiz = quizDAO.retrieve(quizName); 
    double averageScore = quiz.getAverageScore(); 
    Student student = quiz.getStudent(studentName); 
    double score = student.getScore(); 
    return score - averageScore; 
} 
+0

まだよくないです。あなたはメッセージを出すわけではないので、後でこれをデバッグするときに、2つの引数のどちらがnullであるか分かりません。 – GhostCat

0

代わりcalculateDifference()メソッド内NullPointerExceptionを引くの。メソッドのユーザーが何かが間違っている可能性があることを知るために、メソッドが何らかの例外をスローすると宣言するほうがよいでしょう。

IllegalArgumentExceptionを使用し、メソッド内でnullの値をチェックすることをお勧めします。

public double calculateDifference(String studentName, String quizName) 
    throws IllegalArgumentException { 

    Quiz quiz = quizDAO.retrieve(quizName); 
    if(quiz == null) 
    throw new IllegalArgumentException("There is no such quiz!"); 

    double averageScore = quiz.getAverageScore(); 
    Student student = quiz.getStudent(studentName); 
    double score = student.getScore(); 
    return score - averageScore; 
} 

しかし、NullPointerExceptionIllegalArgumentExceptionようRuntimeException Sを使用することの欠点は、メソッドがスローとして宣言されているにもかかわらず、発信者がすべてでそれらをキャッチする必要はありませんので、彼らは、強制されていないということです。したがって、あなた自身のサブクラスExceptionを書くのに苦労したいなら、メソッドのユーザが例外を処理しなければならないので、これを投げるのが最善でしょう。

関連する問題