慎重または防御的なコーディング手法と null セーフ API メソッドを適用することにより、NullPointerException を回避するための最善の回避方法を教えてください。特にJavaでコーディングしているときに、私が分析したことの1つは、nullチェックを入れることであり、使用できるEclipseエディターにアドバイスできるカスタムテンプレートもあります..!!
3 に答える
関数を呼び出して null が返される可能性がある場合は、それを確認する必要があります。一方、どこでも null をチェックすると、防御的になりすぎてコードがわかりにくくなります。ソース コードや Javadoc にアクセスできる場合は、関数が null を返すかどうかを確認できます。
値を期待しているのに変数が null の場合、例外をスローする必要がある場合があります。この場合、別の場所でエラーが発生するため、NPE が役立ちます。
また、@NonNull や @Nullable などのいくつかの注釈があり、一部の静的解析チェッカー (Findbugs など) は、潜在的な null ポインターの問題をキャッチするのに役立ちます。
構築している関数について、null を返すことが理にかなっているかどうかを確認してください。たとえば、関数がコレクションを返す場合、空のコレクションを返すことと null を返すことには違いがあります。
詳細: Null オブジェクト パターン
オブジェクトを操作する前に、null 逆参照を確認してください。
if(something != null) // ドームのことをします。
null 逆参照を却下したい場合は、yoda 記法を使用してください。
if("yes".equals(something) // 何かをする
Eclipse エディター プラグイン? たぶん、スタイルチェックを使用できます。
便利なパターンの 1 つに Option パターンがあります。これは Scala で広く使用されており、同等の Java についてはこちらで説明しています。
簡単に言うと、オブジェクトへの参照を返す代わりに、Option オブジェクトを返します。1 つのサブクラス (Some) には参照が含まれ、別のサブクラス (None) には含まれません。したがって、API は、値が返されない可能性があることを明示的に示しています。基礎となる参照を取り戻すために、与えられたものを決定する必要があります。
例 (疑似コード)
Option<String> value = findNameForId(34);
if (value instanceof Some) {
return ((Some<String>)value).get();
}
else {
throw new Exception();
}
Java ではかなり冗長ですが、Scala ではかなり冗長です。
findNameForId(34) match {
case Some(id) => id
case None => throw new Exception
}
Scala ではさらに簡潔にすることができます。
findNameForId(34).getOrElse(throw new Exception)
また
findNameForId(34).getOrElse(DefaultValue)