オブジェクトの関数を呼び出す前に、NullPointerException
がスローされないように、オブジェクトがnullかどうかを確認する必要があります。
これについて行く最善の方法は何ですか?これらの方法を検討しました。
Javaのプログラミングのベストプラクティスはどれですか。
// Method 1
if (foo != null) {
if (foo.bar()) {
etc...
}
}
// Method 2
if (foo != null ? foo.bar() : false) {
etc...
}
// Method 3
try {
if (foo.bar()) {
etc...
}
} catch (NullPointerException e) {
}
// Method 4 -- Would this work, or would it still call foo.bar()?
if (foo != null && foo.bar()) {
etc...
}
方法4が最適です。
if(foo != null && foo.bar()) {
someStuff();
}
短絡評価 を使用します。つまり、logical AND
の最初の条件がfalseの場合に終了します。
最後で最高のもの。つまり、LOGICAL AND
if (foo != null && foo.bar()) {
etc...
}
論理的に&&
右側が何であるかを知る必要はありません、結果は偽でなければなりません
読むことを好む: Java論理演算子の短絡
Java 8では、nullをチェックする最良の方法は次のとおりです。
Objects.isNull(obj) //returns true if the object is null
Objects.nonNull(obj) //returns true if object is not-null
if(Objects.nonNull(foo) && foo.something()) // Uses short-circuit as well. No Null-pointer Exceptions are thrown.
これとは別に...グアバのオプションクラスも利用できます
前の回答で説明したように、常にtrue
を返す(obj=null)
などの類型エラーを減らします。
NullPointerException
をキャッチしないでください。それは悪い習慣です。値がnullでないことを確認することをお勧めします。方法4は、何が起こるかを明確に示し、最小限のコードを使用するため、はるかに優れています。
方法3は、すべてのレベルで間違っています。アイテムがnullである可能性があるので、例外的な状況ではないことを確認してください。
方法2は、必要以上に複雑にしています。
方法1は、コード4を追加した方法4です。
方法4は、私が見たコードの最も一般的なイディオムだと思います。しかし、これはいつも少し臭い気がします。 foo == nullはfoo.bar()== falseと同じであると想定しています。
それは常に私にとって正しいとは限りません。
方法4は私の好みの方法です。 &&演算子の短絡により、コードが最も読みやすくなります。方法3、NullPointerExceptionをキャッチする方法は、ほとんどの場合、単純なnullチェックで十分な場合に眉をひそめます。
Java 7では、Objects.requireNonNull()
を使用できます。 Java.util
からObjects
クラスのインポートを追加します。
public class FooClass {
//...
public void acceptFoo(Foo obj) {
//If obj is null, NPE is thrown
Objects.requireNonNull(obj).bar(); //or better requireNonNull(obj, "obj is null");
}
//...
}
他の人が言ったように、ライブラリメソッドを使用しないときは#4が最良の方法です。ただし、タイプミスの場合に誤ってnullをfooに割り当てないように、常に比較の左側にnullを配置する必要があります。その場合、コンパイラは間違いを見つけます。
// You meant to do this
if(foo != null){
// But you made a typo like this which will always evaluate to true
if(foo = null)
// Do the comparison in this way
if(null != foo)
// So if you make the mistake in this way the compiler will catch it
if(null = foo){
// obviously the typo is less obvious when doing an equality comparison but it's a good habit either way
if(foo == null){
if(foo = null){
チェックがnullまたは空の場合は、StringUtils.isNoneEmpty("")
を使用することもできます。
呼び出されるAPIを制御する場合は、 GuavaのOptionalクラス の使用を検討してください
詳細 こちら 。メソッドを変更して、Boolean
ではなくOptional<Boolean>
を返すようにします。
これは、Optional
の便利なメソッドの1つを呼び出すことで、nullの可能性を考慮する必要があることを呼び出し元のコードに通知します
二重に等しい「==」でチェックする場合は、次のようなオブジェクト参照でnullをチェックしてください
if(null == obj)
の代わりに
if(obj == null)
単一の等式if(obj = null)を誤って入力すると、trueが返されます(オブジェクトを割り当てると成功(値が 'true')が返されます)。
commons Apacheライブラリへのアクセス権がない場合は、おそらく次のように動作します
if(null != foo && foo.bar()) {
//do something
}
Nullをチェックする単純な1行のコード:
namVar == null ? codTdoForNul() : codTdoForFul();
ObjectクラスのObject.requireNonNull静的メソッドを使用できます。実装は以下です
public void someMethod(SomeClass obj) {
Objects.requireNonNull(obj, "Validation error, obj cannot be null");
}
あなたの最後の提案が最高です。
if (foo != null && foo.bar()) {
etc...
}
なぜなら: