オブジェクトの関数を呼び出す前に、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...
}
最後にして最高のもの、すなわち**LOGICAL AND*** である。
if (foo != null && foo.bar()) {
etc...
}
なぜなら論理的な&&
では
は右辺が何であるかを知る必要はないので、結果は偽でなければなりません。
https://stackoverflow.com/questions/8759868/java-logcial-operators-short-circuiting。
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.
これとは別に。.. グアバのオプションクラスに行くこともできます。
(obj = null)
のような類型エラーを減らします。これは、以前の回答で説明したように常に true
を返します。
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");
}
//...
}
呼び出されるAPIを制御する場合は、Guavaのオプションクラスの使用を検討してください。
詳細情報ここ。 メソッドを変更して、「ブール」の代わりに「オプション<ブール>」を返します。
これは、「オプション」の便利な方法の1つを呼び出すことにより、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){
Commons apacheライブラリにアクセスできない場合は、次の操作で問題ありません。
if(null != foo && foo.bar()) {
//do something
}