1. ホーム

[解決済み】Javaのnullとは何ですか?

2022-04-03 04:45:18

質問

とは何ですか? null ?

null 何かのインスタンス?

どのようなセットで null に属するか?

メモリ内ではどのように表現されていますか?

どのように解決するのですか?

<ブロッククオート

nullは何かのインスタンスなのか?

いいえ。 nullinstanceof .

15.20.2 型比較演算子 instanceof

RelationalExpression:
    RelationalExpression instanceof ReferenceType

実行時に instanceof 演算子は true の値であれば RelationalExpression でない場合 null という参照にキャストすることができました。 ReferenceType を発生させることなく ClassCastException . そうでなければ、結果は false .

これは、任意の型に対して ER の場合、任意の E o ここで o == null , o instanceof R は常に false .


null」はどの集合に属するのでしょうか?

JLS 4.1 型と値の種類

また、特別な ヌル の型、式の型 null という名前を持っていない。なぜなら ヌル 型は名前を持たないので,この型の変数を宣言することはできません。 ヌル 型にキャストしたり ヌル 型になります。また null の式で唯一可能な値です。 ヌル 型になります。また null の参照は常に任意の参照型にキャストすることができます。実際のところ、プログラマは ヌル という型があり null は単なる特別なリテラルで、どのような参照型にもなり得ます。


<ブロッククオート

nullとは何ですか?

上のJLSの引用にあるように、実際には、単に "任意の参照型を持つことができる特別なリテラルである" ということにしておけばよいのです。

Javaでは null == null (となります(他の言語では必ずしもそうとは限りません)。また、契約上、この特別なプロパティも持っていることに注意してください(from java.lang.Object ):

public boolean equals(Object obj)

任意の非 null 基準値 x , x.equals(null) べきである return false .

また、それは デフォルト値 (それを持つ変数の場合)すべての参照型に対応します。

JLS 4.12.5 変数の初期値

  • 各クラス変数、インスタンス変数、配列コンポーネントの初期化は デフォルト値 が作成されたとき。
    • すべての参照タイプにおいて、デフォルト値は null .

その使い方はさまざまです。と呼ばれるものを有効にするために使うことができます。 遅延初期化 フィールドの初期値が null 実際に使用されるまでは、quot;real" の値に置き換えられます(計算が高くつくかもしれません)。

また、他の使い方もあります。実際の例を挙げてみましょう。 java.lang.System :

public static Console console()

リターン : システムコンソールがあればそれを、なければ null .

これは非常によくある使用パターンです。 null は、オブジェクトの非存在を示すために使用されます。

もう一つの使用例です。 java.io.BufferedReader :

public String readLine() throws IOException

リターン : A String 行の内容を含み,行終端文字を含まないもの,または null ストリームの終端に達した場合。

だから、ここで readLine() を返します。 instanceof String を返すまで、各行に対して null で終わりとする。これにより、各行を次のように処理することができます。

String line;
while ((line = reader.readLine()) != null) {
   process(line);
}

APIを設計することで、終了条件が readLine() 戻る null しかし、このデザインには、物事を簡潔にする利点があることがわかる。なお、空行の問題はありません。空行は "" != null .

別の例で、今度は java.util.Map<K,V> :

V get(Object key)

指定されたキーがマッピングされた値を返す、または null このマップにキーのマッピングがない場合。

このマップが null の値が返されます。 null は、必ずしもマップにそのキーのマッピングがないことを示すわけではありません。 null . また containsKey の操作は、この2つのケースを区別するために使用することができる。

ここで null は物事を複雑にする可能性があります。最初の文は、キーがマッピングされていない場合は null が返されます。2つ目のステートメントでは、キーがマッピングされている場合でも null できる また が返される。

それに対して java.util.Hashtable を許可しないことで、物事をよりシンプルにすることができます。 null キーと値で構成され、その V get(Object key) を返す場合は null これは、キーがマッピングされていないことを意味します。

残りのAPIを読めば、どこでどのように null が使用されています。これらは常に ベストプラクティス の例です。

一般的に言えば null は、特殊な値として意味づけするために使用します。

  • 未初期化状態
  • 終了条件
  • 非既存オブジェクト
  • 不明な値

メモリ内ではどのように表現されているのでしょうか?

Javaで?関係ないでしょ。そして、そうしておくのが一番です。


です。 null は良いことなのか?

これはもう主観とのボーダーラインです。ある人はこう言います。 null は、回避できたはずの多くのプログラマーエラーを引き起こします。ある人は NullPointerException Javaでは、プログラマーのエラーに迅速に対応できるため、これを使うのは良いことです。また null を使用することで Nullオブジェクトパターン などがあります。

これはそれ自体で大きなトピックなので、別の質問に対する回答として議論するのがベストです。

の発明者の言葉を引用して終わりにします。 null を、自分自身で作っています。 C.A.R.ホア (quicksortで有名な)。

<ブロッククオート

私はこれを10億ドルの失敗と呼んでいます。 の発明であった。 null 1965年のことです。当時、私はオブジェクト指向言語(ALGOL W)において、参照のための最初の包括的な型システムを設計していました。私の目標は、コンパイラが自動的にチェックを行い、参照の使用は絶対に安全であることを保証することであった。しかし、私はその誘惑に勝てずに null を参照することで、簡単に実装することができます。その結果、無数のエラーや脆弱性、システムクラッシュが発生し、この40年間でおそらく10億ドルの痛手と損害を被ったことでしょう。

その このプレゼンテーションのビデオ より深い内容になっていますので、ぜひご覧ください。