web-dev-qa-db-ja.com

Javaのnullは何ですか?

nullとは何ですか?

nullは何かのインスタンスですか?

nullはどのセットに属していますか?

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

229
unj2

Nullは何かのインスタンスですか?

いいえ、nullinstanceofである型はありません。

15.20.2型比較演算子instanceof

RelationalExpression:
    RelationalExpression instanceof ReferenceType

RelationalExpressionの値がinstanceofではなく、参照がReferenceTypeにキャストされる可能性がある場合、実行時にtrue演算子の結果はnullになります。 ClassCastExceptionを上げずに。それ以外の場合、結果はfalseです。

つまり、すべてのEおよびR、任意のE oo == nullo instanceof Rは常にfalseです。


Nullはどのセットに属しますか?

JLS 4.1種類と値の種類

特別なnull型、式nullの型もあり、これは名前を持ちません。 null型には名前がないため、null型の変数を宣言したり、nullにキャストすることはできません。 タイプnull参照は、null型の式で唯一可能な値です。 null参照は、いつでも任意の参照型にキャストできます。実際には、プログラマはnull型を無視して、単にnullが任意の参照型の特殊なリテラルであることを単にふりをすることができます。


Nullとは何ですか?

上のJLSの引用が述べているように、実際には、それは単に「任意の参照型のものであり得る特別なリテラル」であると単に考えることができます。

Javaでは、null == null(これは他の言語では必ずしもそうではありません)。契約により、この特別なプロパティもあります( Java.lang.Object より)。

public boolean equals(Object obj)

_ null以外の参照値xについては、x.equals(null)return falseにする必要があります。

すべての参照型でデフォルト値(それらを持つ変数の場合)でもあります。

JLS 4.12.5変数の初期値

  • 各クラス変数、インスタンス変数、または配列コンポーネントは、作成時にデフォルト値で初期化されます。
    • すべての参照型で、デフォルト値はnullです。

使い方はさまざまです。これを使用して、いわゆるフィールドの遅延初期化を有効にすることができます。この場合、実際に使用されるまでフィールドの初期値はnullになり、実際の値に置き換えられます。計算するのが高価かもしれません)。

他の用途もあります。 Java.lang.System から実際の例を見てみましょう:

public static Console console()

戻り値:存在する場合はシステムコンソール、それ以外の場合はnull

これは非常に一般的な使用パターンです。nullは、オブジェクトが存在しないことを示すために使用されます。

これは Java.io.BufferedReader からの使用例です。

public String readLine() throws IOException

戻り値:行終了文字を含まない行の内容を含むString、またはストリームの終わりに達した場合はnull

そのため、ここでは、最後を示すnullが最終的に返されるまで、readLine()は各行に対してinstanceof Stringを返します。これにより、各行を次のように処理できます。

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

終了条件がnullを返すreadLine()に依存しないようにAPIを設計できますが、この設計には物事を簡潔にする利点があることがわかります。空行は"" != nullなので、空行でも問題はありません。

Java.util.Map<K,V> から別の例を見てみましょう。

V get(Object key)

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

このマップでnullの値が許可されている場合、戻り値nullは必ずしもマップにキーのマッピングが含まれていないことを示すわけではありません。マップが明示的にキーをnullにマップすることも可能です。これら2つのケースを区別するためにcontainsKey操作を使用することができます。

ここでは、nullを使用すると、状況が複雑になる可能性があることを確認します。最初のステートメントは、キーがマップされていない場合はnullが返されることを示しています。 2番目のステートメントは、キーがマップされていてもnullを返すことができると言っています。

対照的に、 Java.util.Hashtablenullのキーと値を許可しないことで、物事を単純にします。そのV get(Object key)は、nullを返す場合、そのキーがマップされていないことを明確に意味します。

残りのAPIを読み、nullがどこでどのように使用されているかを調べることができます。これらは常にベストプラクティスの例ではないことに注意してください。

一般的に言って、nullは特別な値として使われます。

  • 未初期化状態
  • 終了条件
  • 存在しないオブジェクト
  • 未知の値

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

Javaで?あなたの心配はありません。そしてそれはそのようにしておくのが一番です。


nullは良いことですか?

これは今主観的な境界線です。 nullは避けることができた多くのプログラマーエラーを引き起こすと言う人もいます。 JavaのようにNullPointerExceptionをキャッチする言語では、プログラマーのエラーで失敗する可能性があるので、それを使用するのが良いと言う人もいます。 Nullオブジェクトパターン などを使ってnullを避けている人もいます。

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

私はnull自身の発明者からの引用でこれを終わらせます C.A.R Hoare (quicksort名声の):

私はそれを私の億ドルの間違いと言います。それは1965年のnull参照の発明でした。当時、私は最初の包括的な型システムを設計していました。オブジェクト指向言語(ALGOL W)での参照用。私の目標は、コンパイラが自動的にチェックを実行しながら、すべての参照の使用が絶対に安全であるようにすることです。しかし、私はnull参照を入れるという誘惑に耐えることができませんでした。単純に実装するのが簡単だったからです。これにより、無数のエラー、脆弱性、およびシステムクラッシュが発生し、過去40年間でおそらく10億ドルもの痛みと損傷が発生しています。

このプレゼンテーションのビデオ より深くなります。それはお勧めの時計です。

296

Nullは何かのインスタンスですか?

いいえ、それでnull instanceof Xはすべてのクラスfalseに対してXを返すのです。 (型がオブジェクト型である変数にnullを代入できるという事実にだまされてはいけません。厳密に言えば、代入は暗黙の型変換を含みます。下記参照)

Nullはどのセットに属しますか?

これはnull型の唯一のメンバーで、null型は次のように定義されています。

"名前のない特別なnull型、式nullの型もあります。null型には名前がないため、null型の変数を宣言することは不可能です。 null参照は、null型の式で唯一可能な値ですnull参照は常に任意の参照型にキャストできます実際には、プログラマはnull型を無視して、nullを偽装することができます。単なる特別なリテラルで、どの参照型でもかまいません。 "JLS 4.1

Nullとは何ですか?

上記を参照。いくつかの文脈では、nullは「オブジェクトなし」、「不明」、または「使用不可」を示すために使用されますが、これらの意味はアプリケーション固有のものです。

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

これは実装に固有のものであり、純粋なJavaプログラムではnullの表現を見ることはできません。 (ただし、すべてのJava実装ではないにしても、ほとんどの場合、nullはゼロのマシンアドレス/ポインタとして表されます。)

29
Stephen C

nullとは何ですか?

それは何もないです。

nullは何かのインスタンスですか?

それは何もないとしていいえそれは何のインスタンスにすることはできません。

nullはどの集合に属しますか?

セットなし

それはどのようにメモリに表されますか?

いくつかの参照がそれを指すならば:

Object o=new Object();

ヒープメモリ内で、新しく作成されたオブジェクトに割り当てられたスペース。そしてoはメモリ内の割り当てられた空間を指します。

o=null;

これは今oがオブジェクトのそのメモリ空間を指していないことを意味します。

13
Sanjay Jain

いいえ、それは何のインスタンスではありません、instanceofは常にfalseになります。

8
Tom

Nullキーワードは、null参照を表すリテラルです。どのオブジェクトも参照しません。 nullは、参照型変数のデフォルト値です。

また見てみる

null:Javaの用語集

6
Adriaan Stander

JavaのNULL(tm)

CおよびC++では、 "NULL"はヘッダーファイルで定義された定数で、次のような値です。

    0

または

    0L

または

    ((void*)0)

コンパイラとメモリモデルのオプションによって異なります。 NULLは厳密にはC/C++自体の一部ではありません。

Java(tm)では、 "null"はキーワードではなく、null型の特別なリテラルです。任意の参照型にキャストできますが、intやbooleanなどの基本型にはキャストできません。 NULLリテラルは、必ずしも値ゼロを持ちません。そして、null型にキャストしたり、この型の変数を宣言することは不可能です。

5
p27

Nullはどのクラスのインスタンスでもありません。

ただし、任意の(オブジェクトまたは配列)型の変数にnullを代入することができます。

 // this is false   
 boolean nope = (null instanceof String);

 // but you can still use it as a String
 String x = null;
 "abc".startsWith(null);
4
Thilo

バイトコード表現

Javaのnullは直接JVMをサポートしています。それを実装するために3つの命令が使用されます。

  • aconst_null:例Object o = null;のように変数をnullに設定する
  • ifnullおよびifnonnull:例if (o == null)のようにオブジェクトをnullと比較する

第6章「Java仮想マシン命令セット」 そして、他の命令に対するnullの影響について言及しています。それらの多くに対してNullPointerExceptionがスローされます。

2.4。「参照の型と値」 は総称でnullにも言及しています。

参照値は、特別なnull参照、つまりオブジェクトがないことへの参照である場合もあります。これは、ここではnullと表示されます。 null参照は、最初は実行時型を持ちませんが、任意の型にキャストできます。参照型のデフォルト値はnullです。

nullは特別な値で、何のインスタンスでもありません。明らかな理由でそれはinstanceofにはできません。

3
fastcodejava

nullは、どのクラスのインスタンスでもない特別な値です。これは次のプログラムで説明されています。

public class X {
   void f(Object o)
   { 
      System.out.println(o instanceof String);   // Output is "false"
   }
   public static void main(String[] args) {
      new X().f(null);
   }
}
2
Itay Maman

javaのnullは、C++のnullptrに似ています。

C++でのプログラム

class Point
{
    private:
       int x;
       int y;
    public:
       Point(int ix, int iy)
       {
           x = ix;
           y = iy;
       }
       void print() { std::cout << '(' << x << ',' << y << ')'; }
};
int main()
{
    Point* p = new Point(3,5);
    if (p != nullptr)
    {
       p->print();
       p = nullptr;
    }
    else
    {
        std::cout << "p is null" << std::endl;
    }
    return 0;
}

Javaの同じプログラム:

public class Point {
    private int x;
    private int y;
    public Point(int ix, int iy) {
        x = ix;
        y = iy;
    }
    public void print() { System.out.print("(" + x + "," + y + ")"); }
}
class Program
{
    public static void main(String[] args) {
        Point p = new Point(3,5);
        if (p != null)
        {
            p.print();
            p = null;
        }
        else
        {
            System.out.println("p is null");
        }
    }
}

さて、あなたは上記のコードからJavaの何がnullであるかを理解しますか?そうでなければ、私はあなたがC/C++でポインタを学ぶことをお勧めしますそしてそれからあなたは理解するでしょう。

Cでは、C++とは異なり、nullptrは未定義ですが、代わりにNULLが使用されます。これはC++でも使用できますが、C++ではnullptrが常にポインタに関連しているためです。そのため、C++ではサフィックス "ptr"がWordの末尾に追加され、またすべての文字が小文字になりましたが、これはそれほど重要ではありません。

Javaでは、非プリミティブ型クラスのすべての変数は常にその型のオブジェクトへの参照または継承され、nullはnullクラスのオブジェクト参照ですが、nullポインタではありません。Javaではそのようなことはない代わりにオブジェクトが使用され、Javaのnullはクラスオブジェクト参照に関連しているため、 "nullref"または "nullrefobj"と呼ぶこともできますが、これは長いので、単に "null"と呼びます。

C++では、オプションメンバー/変数、つまり値を持たないメンバー/変数にポインターとnullptr値を使用できます。つまり、値がない場合はnullptrと同じになります。例えば使用されます。

1
user2133061

すべての質問にJLSから正式に回答する短くて正確な回答:

3.10.7。ヌルリテラル

Null型には、nullリテラルnullで表される1つの値、null参照があります。これは、ASCII文字から形成されます。

NULLリテラルは常にNULL型です。

Nullに割り当てられている型の参照だけが割り当てられます。あなたは参照に値(オブジェクト)を割り当てません。このような割り当ては、JVMにどの程度の参照が必要で、どのメモリー領域に割り当てられるかに固有のものです。

0

Javaには、主に2つのタイプの型があります。基本参照です。プリミティブ型として宣言された変数は値を格納します。参照型として宣言された変数は参照を格納します。

String x = null;

この場合、初期化ステートメントは変数 "x"を宣言します。 “ x”は文字列参照を格納します。これはnullです。まず、nullは有効なオブジェクトインスタンスではないため、割り当てられたメモリはありません。オブジェクト参照が現在オブジェクトを参照していないことを示す値です。

0
Anand

私の考えでは、Javaでnullを見る興味深い方法は、それを情報の欠如を意味するものではなく、単に任意の型の参照に割り当てることができるリテラル値と見なすことです。もしそれが情報の欠如を示していると考えるならば、a1 == a2がtrueであることは意味がありません(両方ともnullの値が割り当てられている場合)。どのオブジェクトを指しているべきかわからない)...ところで、null == nullはJavaでtrueを返します。 Javaの場合SQL:1999のようになると、null == nullはunknownを返します(SQL:1999のブール値は、true、false、unknownの3つの値を取りますが、実際には、unknownは実際のシステムではnullとして実装されます)... http://en.wikipedia.org/wiki/SQL

0
Bat0u89