質問

javaコードでnullチェックを行うと、null値のIllegalargumentexceptionsをスローする場合、どのようなメッセージテンプレートを使用していますか?

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

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

より良いもの:「null」または「null」、そしてなぜですか?

私にとって「null」はより自然に感じます。

役に立ちましたか?

解決

以来 Exception 前提条件のチェックが失敗したために投げられます。単に事実を述べるのではなく、 要件 それは侵害されました。

つまり、言う代わりに "username is null", 、 いう "username should not be null".


前提条件チェックにライブラリを使用すること

ヒントとして、前処理チェックを容易にするように設計された多くのライブラリのいずれかを使用できます。 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");

さらに、クライアントはすでに事実を認識している可能性があるため、これも潜在的に有用ではありません。例外は実際のものを理解するのに役立ちません 要件 それは。


の上 IllegalArgumentException vs NullPointerException

元のコードがスローされている間 IllegalArgumentException の上 null 議論、グアバ Preconditions.checkNotNull スロー NullPointerException 代わりは。

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

NullPointerException: :アプリケーションは、このクラスのインスタンスをスローして、 null 物体。

さらに、ここからの引用があります 効果的なJava第2版:アイテム60:標準例外の使用を支持する:

おそらく、すべての誤った方法の呼び出しは違法な議論または違法な状態に要約されますが、他の例外は標準的に使用されています ある種の 違法な議論と状態の。発信者が合格した場合 null ヌル値が禁止されているいくつかのパラメーターでは、条約はそれを決定します NullPointerException ではなく投げられる IllegalArgumentException.

他のヒント

無効です, 、議論はまだnullです。

しかし、メッセージなしでnullpointerexceptionを投げるだけではなぜですか?

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

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

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

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

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

これにより、1つの石で2羽の鳥が殺されます。まず、ユーザー名が空の文字列である場合を検出します。これは(引数のために)エラーだと仮定しています。第二に、パラメーターがある場合 null 派遣しようとしています length 呼び出しはを与えます NullPointerException.

記録のために、 期待される 予期しないものを投げる例外 nullNullPointerException. 。それを使用しない主な理由は、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はほとんど常にaを示しているためです 別の種類の問題 他の種類の引数検証エラーに。たとえば、初期化されていないフィールドまたはアレイセルまたは適切に処理されていない「オプションの」値。

最後に質問に:

より良いもの: "is null" また "was null", 、 なぜ?

これは意見の問題ですが、私は書くでしょう "is null".

  • メッセージは、例外がスローされたときに状態を報告しているためです。
  • そのようにするのは従来のものだからです。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top