11

Java コードで null チェックを実行し、null 値に対して IllegalArgumentExceptions をスローする場合、どの種類のメッセージ テンプレートを使用しますか?

私たちはこのようなものを使う傾向があります

public User getUser(String username){
   if (username == null){
     throw new IllegalArgumentException("username is null");   
   }
   // ...
}

"is null" または "was null" のどちらが優れているか、またその理由は?

私にとっては「is null」の方が自然に感じます。

4

4 に答える 4

15

Exception前提条件のチェックに失敗したためにスローされるため、単に事実を述べるのではなく、違反した要件を述べる必要があると思います。

つまり、と言う代わりに"username is null"、と言い"username should not be null"ます。


前提条件チェックのためのライブラリの使用について

ヒントとして、前提条件のチェックを容易にするために設計された多くのライブラリの 1 つを使用できます。Guava の多くのコードで使用com.google.common.base.Preconditions

正しい引数と状態を検証するために独自のメソッドの開始時に呼び出される単純な静的メソッド。これにより、次のような構成が可能になります。

 if (count <= 0) {
   throw new IllegalArgumentException("must be positive: " + count);
 }

コンパクトなものに交換

 checkArgument(count > 0, "must be positive: %s", count);

ここでより直接的に関連するのはcheckNotNull、 があることです。これにより、次のように簡単に書くことができます。

  checkNotNull(username, "username should not be null");

上記のコードがいかに自然に読み取れるかに注意してください。詳細なメッセージには、違反した要件が明示的に示されています。

事実を述べる別の方法は、より厄介です。

 // Awkward!
 checkArgument(count > 0, "is negative or zero: %s", count);
 checkNotNull(username, "username is null");

さらに、クライアントはすでに事実を認識している可能性があり、例外は実際の要件が何であるかを理解するのに役立たないため、これはあまり役に立たない可能性もあります。


IllegalArgumentExceptionNullPointerException

元のコードは引数をスローIllegalArgumentExceptionnullますが、Guavaは代わりにPreconditions.checkNotNullスローしNullPointerExceptionます。

これは、API によって設定されたガイドラインに従っています。

NullPointerException: アプリケーションは、オブジェクトの他の不正な使用を示すために、このクラスのインスタンスをスローする必要がありnullます。

さらに、Effective Java 2nd Edition からの引用は次のとおりです: Item 60: Favor the use of standard exceptions :

おそらく、すべての誤ったメソッド呼び出しは、不正な引数または不正な状態に要約されますが、他の例外は、特定の種類の不正な引数および状態に対して標準的に使用されます。呼び出し元がnullnull 値が禁止されているパラメーターを渡した場合、規則では、NullPointerExceptionではなく がスローされることが規定されていますIllegalArgumentException

于 2010-06-11T11:34:43.217 に答える
5

引数がまだ null であるため、 null です

ただし、単にメッセージなしで NullPointerException をスローしないのはなぜでしょうか?

于 2010-06-11T11:32:55.120 に答える
0

私は言うことをお勧めします

  if (userName == null) {
     throw new IllegalArgumentException("username == null");
   }

これは非常に致命的であるため、プログラマーはとにかくそれを見なければなりません。例外メッセージで問題のあるコードスニペットを参照することは、私が想像できる最も簡潔なことです。

于 2010-06-11T12:32:55.800 に答える
0

私はこれを書く傾向があります:

public User getUser(String username) {
   if (username.length() == 0) {
       throw new IllegalArgumentException("username is empty");   
   }
   // ...
}

これは一石二鳥です。まず、ユーザー名が空の文字列であるケースを検出します。これは (議論のために) エラーであると想定しています。次に、パラメーターがnullディスパッチしようとしている場合、length呼び出しはNullPointerException.

記録として、予期しないものに対してスローされると予想される例外nullですNullPointerException。これを使用しない主な理由が、通常、NPE にメッセージがないことである場合は、次のようにコーディングします。

public User getUser(String username){
   if (username == null){
       throw new NullPointerException("username is null");   
   }
   if (username.length() == 0) {
       throw new IllegalArgumentException("username is empty");   
   }
   // ...
}

ここで NPE を使用する理由 NPE はほとんどの場合、他の種類の引数検証エラーとは異なる種類の問題を示しているためです。たとえば、初期化されていないフィールドまたは配列セル、または適切に処理されていない「オプション」の値です。

最後に質問に:

どちらが良いですか :"is null"または"was null", そしてその理由は?

これは意見の問題ですが、私は書き"is null"ます。

  • メッセージは、例外がスローされたときの状態を報告しているためです。
  • そうするのが常識だからです。
于 2010-06-11T13:35:23.063 に答える