第9章. NULLをオプションで処理する
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
NullPointerExceptions多くの人は、 参照をnull 10億ドルの間違いと呼んでいる。 実は、 の発明者自身が、もともとこのフレーズを作ったのだ: null
私はそれを10億ドルの過ちと呼んでいる。
それは、1965年の
null参照の発明である。当時、私はオブジェクト指向言語(ALGOL W)において、参照のための最初の包括的な型システムを設計していた。私の目標は、コンパイラが自動的にチェックを行うことで、参照のすべての使用が絶対的に安全であることを保証することだった。しかし、null参照は実装が非常に簡単だったため、私はその誘惑に勝てなかった。これが無数のエラー、脆弱性、システムクラッシュを引き起こし、過去40年間でおそらく10億ドルの痛手と損害を与えた。
チャールズ・アントニー・リチャード・ホア卿(2009年QCon London)
この「間違い」をどう扱うかについて絶対的なコンセンサスはないが、多くのプログラミング言語には、null 参照を適切かつ慣用的に扱う方法があり、多くの場合、言語自体に直接組み込まれている。
この章では、Javaがnull 参照をどのように扱うか、また、Optional<T> 型とその関数APIを使ってコード内でそれをどのように改善するかを紹介し、Optionalsを使う方法、タイミング、使わないタイミングを学ぶ。
null参照の問題点
false 値がない場合のJavaの扱いは、型によって異なる。 すべてのプリミティブ型にはデフォルト値があり、例えば、数値型にはゼロと等価な値が、boolean 。クラス、インタフェース、配列などの非プリミティブ型では、未割り当ての場合、デフォルト値としてnull 、これは変数がオブジェクトを参照していないことを意味する。
注
参照型の概念は、C/C++のポインタと似ているように思えるかもしれないが、Javaの参照型は、reference と呼ばれるJVM内部の特殊化された型である。 JVMは、型の安全性を確保し、メモリ・アクセスを保護するために、参照型を厳密に制御する。
null 参照は単なる「何もない」状態ではなく、特別な状態である。なぜならnull は、実際の型に関係なく、どんなオブジェクト参照にも使える一般化型だからである。null 参照にアクセスしようとすると、JVMはNullPointerException をスローし、適切に処理しないと現在のスレッドがクラッシュしてしまう。 これは通常、例9-1に見られるように、実行時にいたるところで null チェックを要求する、防御的プログラミングアプローチによって緩和される。