web-dev-qa-db-ja.com

!= nullステートメントを回避する方法は?

私は NullPointerException を避けるためにコードobject != nullを使用します。次のようにこれを解決するための良い代替手段はありますか?

if (someobject != null) {
    someobject.doCalc();
}

これがNullPointerExceptionでは機能しません。オブジェクトがnullまたはnot

2

ジレンマ

null値を持つ変数がプログラムで使用されてNullPointerExceptionが発生した場合、これは明らかにプログラムで予期されなかった状況です。 「null値の可能性を考慮に入れていなかったか、ここでは値がnullになることはないと想定していたので、期待していませんでしたか?」

答えが後者の場合、null値を処理しなかったために問題は発生していません。問題は以前に発生し、使用されている特定の行でのエラーの結果のみが表示されています。この場合、単にif (variable != null)を追加するだけではカットされません。変数がnullだったために実行するはずだった行をスキップし、最終的にはnullではないと想定した場所でさらに行をヒットします。

nullを使用する必要がある場合

原則として、「不在」が可能な戻り値である場合にのみnullを返します。つまり、データレイヤーは特定のIDを持つレコードを検索する場合があります。そのレコードが見つからない場合は、例外をスローするか、単にnullを返すことができます。どちらを実行してもかまいませんが、可能性が非常に高い状況では例外をスローしないようにしています。したがって、値の代わりにnullを返します。

このメソッドの呼び出し元は、おそらくあなたが作成したものであり、レコードが存在しない可能性があることを認識し、それに応じてnullをチェックします。この場合、これには何の問題もありませんが、handleこの可能性をできるだけ早くプログラムのすべての場所でnull値の可能性に対処する必要があります。 。

結論

言い換えれば、nullを正当な値として扱いますが、待つのではなく、ただちに対応してください。プログラムで理想的には、それがnullであるかどうかをプログラムで一度だけ確認し、そのようなnull値が処理される場所でのみ確認する必要があります。

everyの値がnullでないことが予想される場合は、チェックを追加する必要はありません。 nullの場合は、インスタンス化されたときにプログラムにエラーがあることを受け入れます。本質的には、フェイルセーフよりフェイルファストが優先されます。

5
Neil

nullをオブジェクト値として許可するかどうかを決定することは、プロジェクトで意識的にを行う必要がある決定です。

言語構造が存在するからといって、それを受け入れる必要はありません。実際、プロジェクト全体でanynullvaluesに対して厳格なルールを適用する方が良い場合がよくあります。これを行う場合、チェックは必要ありません。 NullPointerExceptionが発生した場合、それは自動的にコードに欠陥があることを意味し、これがNPEによって通知されたか、他の健全性チェックメカニズムによって通知されたかは問題ではありません。

これができない場合、たとえば、nullを許可する他のライブラリと相互運用する必要がある場合は、それを確認する必要があります。それでも、nullが可能なコード領域を可能な限り小さくすることは理にかなっています。プロジェクトが大きくなるほど、「腐敗防止レイヤー」全体を定義する意味が増し、他の場所よりも厳密な価値保証を維持することだけが目的になります。

8
Kilian Foth

Java 8に、新しい機能が追加されました:_Optional<>_。これは、フィールドの有無にかかわらず、nullチェックを使用する代わりになります。

Optionalを使用する場合、isPresent()を呼び出すことで、それが存在するかどうかを確認できます。

_Optional<String> optionalString = Optional.of("Some string");
if (optionalString.isPresent()){
  System.out.println(optinalString.get());
}

Optional<String> optionalString2 = Optional.ofNullable(null);
System.out.println(optionalString2.orElse("Some other string"));
_

https://docs.Oracle.com/javase/10/docs/api/Java/util/Optional.html にあるドキュメントを参照してください。

これは、外部ライブラリがnullを返す可能性があるため、他にnullがあり、NPEをスローできる場合は、Optionalsのみが値を持たないことを許可されていることを意味します。

6