私は NullPointerException
を避けるためにコードobject != null
を使用します。次のようにこれを解決するための良い代替手段はありますか?
if (someobject != null) {
someobject.doCalc();
}
これがNullPointerException
では機能しません。オブジェクトがnullまたはnot。
null
値を持つ変数がプログラムで使用されてNullPointerException
が発生した場合、これは明らかにプログラムで予期されなかった状況です。 「null
値の可能性を考慮に入れていなかったか、ここでは値がnull
になることはないと想定していたので、期待していませんでしたか?」
答えが後者の場合、null
値を処理しなかったために問題は発生していません。問題は以前に発生し、使用されている特定の行でのエラーの結果のみが表示されています。この場合、単にif (variable != null)
を追加するだけではカットされません。変数がnull
だったために実行するはずだった行をスキップし、最終的にはnull
ではないと想定した場所でさらに行をヒットします。
null
を使用する必要がある場合原則として、「不在」が可能な戻り値である場合にのみnullを返します。つまり、データレイヤーは特定のIDを持つレコードを検索する場合があります。そのレコードが見つからない場合は、例外をスローするか、単にnullを返すことができます。どちらを実行してもかまいませんが、可能性が非常に高い状況では例外をスローしないようにしています。したがって、値の代わりにnull
を返します。
このメソッドの呼び出し元は、おそらくあなたが作成したものであり、レコードが存在しない可能性があることを認識し、それに応じてnull
をチェックします。この場合、これには何の問題もありませんが、handleこの可能性をできるだけ早くプログラムのすべての場所でnull
値の可能性に対処する必要があります。 。
言い換えれば、null
を正当な値として扱いますが、待つのではなく、ただちに対応してください。プログラムで理想的には、それがnull
であるかどうかをプログラムで一度だけ確認し、そのようなnull
値が処理される場所でのみ確認する必要があります。
everyの値がnullでないことが予想される場合は、チェックを追加する必要はありません。 null
の場合は、インスタンス化されたときにプログラムにエラーがあることを受け入れます。本質的には、フェイルセーフよりフェイルファストが優先されます。
null
をオブジェクト値として許可するかどうかを決定することは、プロジェクトで意識的にを行う必要がある決定です。
言語構造が存在するからといって、それを受け入れる必要はありません。実際、プロジェクト全体でanynull
valuesに対して厳格なルールを適用する方が良い場合がよくあります。これを行う場合、チェックは必要ありません。 NullPointerExceptionが発生した場合、それは自動的にコードに欠陥があることを意味し、これがNPEによって通知されたか、他の健全性チェックメカニズムによって通知されたかは問題ではありません。
これができない場合、たとえば、null
を許可する他のライブラリと相互運用する必要がある場合は、それを確認する必要があります。それでも、null
が可能なコード領域を可能な限り小さくすることは理にかなっています。プロジェクトが大きくなるほど、「腐敗防止レイヤー」全体を定義する意味が増し、他の場所よりも厳密な価値保証を維持することだけが目的になります。
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
のみが値を持たないことを許可されていることを意味します。