2016-11-23 14 views
1

NullPointerExceptionをスローしたいときはどうすればよいですか? 2ではtry/catch対if/else NullPointerExceptionをスローする

1)

if(parameter != null){ 
    // do something 
} else { 
    Log.error("Reason for Exception."); 
    throw new NullPointerException(); 
} 

2)

try{ 
    // do something 
} catch (NullPointerException npe) { 
    Log.error("Reson for Exception."); 
    throw npe; 
} 
+1

いいえ、私は 'IllegalArgumentException'を投げますが、私は最初のものを好むです – Pau

+1

正直なところ...' NPE'を手動で起動することは決してありませんでした。もし ' IllegalArgumentException'がそこにあります。 – SomeJavaGuy

+0

【効果のJava(https://books.google.hr/books?id=ka2VUBqHiWkC&pg=PA248&lpg=PA248&dq=effective+java+standard+exceptions&source=bl&ots=yZJoQmw0M0&sig=8BlDhQjQqy3g41tQCCS2Znuk_T8&hl=en&sa=X&ved=0ahUKEwi1-sqiub7QAhXKIsAKHWNXBaAQ6AEIPzAG#v= onepage&q&f = false)はNPEにアドバイスしますが、私はKevinとPauの側にもいます。 –

答えて

3

)あなたは、NPEを投げた表現を正確に知ることができません。 1)例外をスローする理由は完全にはっきりしています。必要に応じて、多数の個別のヌルチェックを行います。

if (arg == null) { 
    throw new IllegalArgumentException("arg is null"); 
} 
... just go on with the method, no else block needed 

をそして、あなたは、Java 7の上に、少なくともしている場合:

しかし、あなたの最初のアプローチは、書き換えるべき

Objects.requireNonNull(arg, "arg is null"); 

第二の点:一般的なルールは投げることのいずれかであります例外を除外するか、エラーをログに記録します。両方を同時に実行することはできません。この場合、スローするように選択する必要があります。また、すべての例外が捕捉され、記録される作業単位全体をカバーする中央の場所が1つだけあります。

+0

しかし、戻り値を持つメソッドのif/elseを追加するとどうしますか?(いくつかの特定のオブジェクト)私はその場合、エラーが発生したことを確認します。 – SchAlubs

+1

例外をスローすると、何も返されません。 –

+0

私は知っていますが、ロギング時に例外をスローするべきではないと言いました。 – SchAlubs

-1

パラメータがnullでないことを確認しようとしている場合は、Guava's Preconditions、特にcheckNotNullをお勧めします。

Preconditions.checkNotNull(parameter, "Please specify a value for parameter"); 

パラメータがnullの場合、メッセージが指定されたNPEがスローされます。

1

まず、IllegalArgumentExceptionよりNullPointerExceptionを使用します。しかし、両方の中から選択する場合、私は最初の方が好きです。

そうでなければ、このような定型的なコードを避けるために、私の意見ではそれは醜いものになります。私はそれをチェックするAssertクラスを使用します。あなた自身のAssertクラスを行うこともできますし、Spring Assertのように、いくつかのものを使うこともできます。

あなたAssertクラスはこのようなものになるだろう:

Assert.isNotNull(parameter); 
+0

これはJDKに含まれています。https://docs.oracle.com/javase/7/docs/api/java/util/Objects.html#requireNonNull(T,%20java.lang.String) –

+0

特定の例外よりも特定の例外? – EJP

1

最初のコード:

public Assert { 

    public static void isNotNull(Object object) { 
      if(null == object) 
       throw new IllegalArgumentException(".. must be not null"); 
    } 

    .... 

} 

は、次に、あなたはちょうどそのようにそれを使用する必要があります(これは、1行にboilperplateコードを削減します)既に値をテストしていて、if条件に失敗した場合にnullの結果を与えることができるので、適切に見えます。

関連する問題