すべてのメソッドは、パラメーター値のセットを受け入れます。入力パラメータがnullでないことを常に検証する必要がありますか、それとも従来のRunTimeException
でコードが失敗することを許可する必要がありますか?
入力パラメータのヌル性を実際にチェックせず、パラメータを使用してビジネスロジックを記述するだけのコードをたくさん見ました。最良の方法は何ですか?
void public( String a, Integer b, Object c)
{
if( a == null || b == null || c == null)
{
throw new RunTimeException("Message...");
}
.....business logic.....
}
最善の方法は必要な場合にのみチェックするです。
たとえば、メソッドがprivate
であり、他の誰もそれを使用していないことがわかっていて、nullを渡していないことがわかっている場合は、再度チェックする必要はありません。
ただし、メソッドがpublic
の場合、APIのユーザーが何をしようとするかは誰にもわからないので、よく確認してください。
疑わしい場合はチェックの場合。
ただし、できる最善の方法がNullPointerException
をスローすることである場合は、チェックしたくない場合があります。例えば:
_int getStringLength(String str) {
return str.length();
}
_
null
をチェックしたとしても、合理的なオプションはNullPointerException
をスローすることです。これは、とにかくstr.length()
が行います。
いいえ。パラメータがnullにならず、そうでない場合はNullPointerExceptionがスローされると想定するのが標準です。メソッドでパラメーターをnullにできる場合は、APIでそのことを指定する必要があります。
参照がnull
になる可能性があることは、Java)の不幸な側面であり、そうでないことを言語で指定する方法はありません。
したがって、一般的にはそうです。null
の解釈を作成したり、後でNPEがスローされる可能性がある状況になったりしないでください。
JSR305(現在は非アクティブ)を使用すると、パラメーターに注釈を付けて、null
sを指定しないように指定できます。
void fn(@Nonnull String a, @Nonnull Integer b, @Nonnull Object c) {
冗長ですが、それはJavaです。ほとんど同じことを行うが、標準ではない他の注釈ライブラリとチェッカーがあります。
(大文字の使用に関する注意:「non-thing」の形式のキャメルケースの単語の場合、 標準 は、クラスの名前でない限り、ルートの単語を大文字にしないでください。したがって、nonthing
およびnonnull
。)
チェッカーが実行される場合を除いて、注釈も実際にはルールを適用しません。チェックを行うメソッドを静的に含めることができます。
public static <T> T nonnull(T value) {
if (value == null) {
throwNPE();
}
return value;
}
private static void throwNPE() {
throw new NullPointerException();
}
値を返すことは、コンストラクターで便利です。
import static pkg.Check.nonnull;
class MyClass {
@Nonnull private final String thing;
public MyClass(@Nonnull String thing) {
this.thing = nonnull(thing);
}
...
引数のいずれかがnull
であると予想するかどうか、より正確には、一部のパラメーターがnull
である場合でも、メソッドが正しい決定を行うことができるかどうかによって異なります。
そうでない場合は、null
をチェックして例外を発生させることをお勧めします。そうしないと、NullPointerException
が取得されますが、その外観は常にチェックを忘れたことを示しているため、決してキャッチしないでください。コード内の変数。 (そしてそれを捕まえると、それが投げられる他の出来事を見逃すかもしれず、バグを導入するかもしれません)。
一方、RunTimeException
またはその他のカスタム例外をスローした場合は、アップストリームのどこかでそれを処理できるため、何が行われるかをより細かく制御できます。
重要なランタイムパラメータが欠落しているなど、システムの操作にとって本当に致命的な状態でない限り、ランタイム例外をスローしないでください。ただし、システムが起動してはならないため、これには疑問があります。
ビジネスルールは何ですか?フィールドにnullは許可されていますか?そうじゃない?
いずれの場合も、渡されたパラメータを操作する前に、渡されたパラメータのnullをチェックすることをお勧めします。これにより、誰かが不正なデータを渡したときにNullPointerExceptions
を取得しません。
はい、特に不正な入力がメソッドのコード内で問題を引き起こす可能性がある場合は、パブリックメソッドで入力をスクラブする必要があります。早く失敗するのは良い考えです。つまり、できるだけ早く確認してください。 Java 7は新しいObjects
クラスを追加しました。これにより、nullパラメータを簡単にチェックし、カスタマイズされたメッセージを含めることができます。
public final void doSomething(String s)
{
Objects.requireNonNull(s, "The input String cannot be null");
// rest of your code goes here...
}
これにより、NullPointerException
がスローされます。
Objects
クラスのJavadoc: http://docs.Oracle.com/javase/7/docs/api/Java/util/Objects.html
いいえ、それを普遍的に行うべきではありません。
私の好みは、順番に、次のようになります。
これを行うことにはあまり意味がありません。 a
、b
、またはc
を初めて操作しようとしたときに、無料で得られる動作を複製しているだけです。
それはあなたのコードが何をしようとしているのか、そしてあなたがException
を投げたい状況に依存します。メソッドがnull値で正しく機能しない場合は、メソッドが常に例外をスローするようにしたい場合があります。メソッドがnull値を回避できる場合は、おそらく例外をスローする必要はありません。
チェックされた例外を追加しすぎると、非常に複雑で複雑なコードになる可能性があります。これが、C#に含まれていなかった理由です。