it-swarm.com.de

Was ist null in Java?

Was ist null?

Ist null eine Instanz von irgendetwas?

Zu welcher Menge gehört null?

Wie ist es in der Erinnerung dargestellt?

234
unj2

Ist null eine Instanz von irgendetwas?

Nein, es gibt keinen Typ, bei dem null eine instanceof ist.

15.20.2 Typvergleichsoperator instanceof

RelationalExpression:
    RelationalExpression instanceof ReferenceType

Zur Laufzeit lautet das Ergebnis des Operators instanceoftrue, wenn der Wert von RelationalExpression nicht null ist und die Referenz umgewandelt werden kann das ReferenceType ohne Erhöhen eines ClassCastException. Ansonsten ist das Ergebnis false.

Dies bedeutet, dass für jeden Typ E und R für jeden E o, Wobei o == null, o instanceof R Immer false ist. ].


Zu welcher Menge gehört 'null'?

JLS 4.1 Die Arten von Typen und Werten

Es gibt auch einen speziellen null -Typ, den Typ des Ausdrucks null, der keinen Namen hat. Da der Typ null keinen Namen hat, ist es unmöglich, eine Variable vom Typ null zu deklarieren oder in den Typ null umzuwandeln. Die Referenz null ist der einzig mögliche Wert eines Ausdrucks vom Typ null. Die Referenz null kann immer in einen beliebigen Referenztyp umgewandelt werden. In der Praxis kann der Programmierer den Typ null ignorieren und einfach so tun, als wäre null nur ein spezielles Literal, das von einem beliebigen Referenztyp sein kann.


Was ist null?

Wie das obige JLS-Zitat besagt, kann man in der Praxis einfach so tun, als sei es "nur ein spezielles Literal, das von einem beliebigen Referenztyp sein kann".

In Java null == null (Dies ist in anderen Sprachen nicht immer der Fall). Beachten Sie auch, dass es laut Vertrag auch diese besondere Eigenschaft hat (von Java.lang.Object ):

public boolean equals(Object obj)

Für jeden Nicht-Referenzwert nullx sollte x.equals(null)return false.

Es ist auch der Standardwert ​​(für Variablen, die sie haben) für alle Referenztypen:

JLS 4.12.5 Anfangswerte von Variablen

  • Jede Klassenvariable, Instanzvariable oder Array-Komponente wird beim Erstellen mit einem Standardwert ​​initialisiert:
    • Der Standardwert für alle Referenztypen ist null.

Wie dies verwendet wird, ist unterschiedlich. Sie können es verwenden, um das zu aktivieren, was als verzögerte Initialisierung von Feldern bezeichnet wird, wobei ein Feld seinen Anfangswert von null haben würde, bis es tatsächlich verwendet wird, wobei es durch den "echten" Wert ersetzt wird (Die Berechnung kann teuer sein.).

Es gibt auch andere Verwendungen. Nehmen wir ein reales Beispiel von Java.lang.System :

public static Console console()

Rückgabe : Die Systemkonsole, falls vorhanden, ansonsten null.

Dies ist ein sehr verbreitetes Verwendungsmuster: null wird verwendet, um die Nichtexistenz eines Objekts anzuzeigen.

Hier ist ein weiteres Verwendungsbeispiel, diesmal von Java.io.BufferedReader :

public String readLine() throws IOException

Gibt zurück: Ein String, das den Inhalt der Zeile ohne Zeilenabschlusszeichen enthält, oder null, wenn das ende des stroms ist erreicht.

Hier würde readLine()instanceof String Für jede Zeile zurückgeben, bis schließlich ein null zurückgegeben wird, um das Ende zu kennzeichnen. Auf diese Weise können Sie jede Zeile wie folgt verarbeiten:

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

Man kann die API so entwerfen, dass die Beendigungsbedingung nicht von der Rückgabe von null durch readLine() abhängt, aber man kann sehen, dass dieses Design den Vorteil hat, die Dinge kurz zu halten. Beachten Sie, dass es kein Problem mit Leerzeilen gibt, da eine Leerzeile "" != null.

Nehmen wir ein weiteres Beispiel, diesmal von Java.util.Map<K,V> :

V get(Object key)

Gibt den Wert zurück, dem der angegebene Schlüssel zugeordnet ist, oder null, wenn diese Zuordnung keine Zuordnung für den Schlüssel enthält.

Wenn diese Zuordnung null zulässt, gibt ein Rückgabewert von null nicht unbedingt an, dass die Zuordnung keine Zuordnung für den Schlüssel enthält. Es ist auch möglich, dass die Zuordnung den Schlüssel explizit null zuordnet. Die Operation containsKey kann verwendet werden, um diese beiden Fälle zu unterscheiden.

Hier sehen wir, wie die Verwendung von null die Dinge komplizieren kann. Die erste Anweisung besagt, dass null zurückgegeben wird, wenn der Schlüssel nicht zugeordnet ist. Die zweite Anweisung besagt, dass null zurückgegeben werden kann, auch wenn der Schlüssel zugeordnet ist auch.

Im Gegensatz dazu vereinfacht Java.util.Hashtable die Dinge, indem null - Schlüssel und -Werte nicht zugelassen werden. Wenn V get(Object key)null zurückgibt, bedeutet dies eindeutig, dass die Taste nicht zugeordnet ist.

Sie können den Rest der APIs durchlesen und herausfinden, wo und wie null verwendet wird. Denken Sie daran, dass dies nicht immer die Best Practice Beispiele sind.

Im Allgemeinen wird null als spezieller Wert verwendet, um Folgendes zu kennzeichnen:

  • Nicht initialisierter Zustand
  • Kündigungsbedingung
  • Nicht existierendes Objekt
  • Ein unbekannter Wert

Wie ist es in der Erinnerung dargestellt?

In Java? Geht Sie nichts an. Und es ist am besten so zu halten.


Ist null eine gute Sache?

Dies ist jetzt grenzwertig subjektiv. Einige Leute sagen, dass null viele Programmiererfehler verursacht, die hätten vermieden werden können. Einige sagen, dass es in einer Sprache, die NullPointerException wie Java abfängt, gut ist, sie zu verwenden, da Sie bei Programmierfehlern schnell ausfallen. Einige Leute vermeiden null, indem sie Null-Objektmuster usw. verwenden.

Dies ist ein riesiges Thema für sich, weshalb es am besten als Antwort auf eine andere Frage erörtert wird.

Ich werde dies mit einem Zitat des Erfinders von null selbst beenden, C.A.R Hoare (of quicksort fame):

Ich nenne es meinen Milliarden-Dollar-Fehler. Es war die Erfindung der Referenz null im Jahr 1965. Zu dieser Zeit entwarf ich das erste umfassende Typensystem für Referenzen in einer objektorientierten Sprache (ALGOL W). Mein Ziel war es, sicherzustellen, dass jede Verwendung von Referenzen absolut sicher ist, wobei die Überprüfung automatisch vom Compiler durchgeführt wird. Aber ich konnte der Versuchung nicht widerstehen, einen Verweis null einzufügen, einfach weil es so einfach zu implementieren war. Dies hat zu unzähligen Fehlern, Sicherheitslücken und Systemabstürzen geführt, die in den letzten vierzig Jahren wahrscheinlich eine Milliarde Dollar an Schmerzen und Schäden verursacht haben.

Das Video dieser Präsentation geht tiefer; Es ist eine empfohlene Uhr.

298

Ist null eine Instanz von irgendetwas?

Nein, deshalb null instanceof X gibt false für alle Klassen X zurück. (Lassen Sie sich nicht von der Tatsache täuschen, dass Sie einer Variablen, deren Typ ein Objekttyp ist, null zuweisen können. Genau genommen beinhaltet die Zuweisung eine implizite Typkonvertierung; siehe unten.)

Zu welcher Menge gehört 'null'?

Es ist das einzige Mitglied des NULL-Typs, wobei der NULL-Typ wie folgt definiert ist:

"Es gibt auch einen speziellen NULL - Typ, den Typ des Ausdrucks NULL, der keinen Namen hat. Da der NULL - Typ keinen Namen hat, ist es unmöglich, eine Variable vom Typ NULL oder NULL zu deklarieren Die Nullreferenz ist der einzig mögliche Wert eines Ausdrucks vom Typ Null. Die Nullreferenz kann immer in einen beliebigen Referenztyp umgewandelt werden. In der Praxis kann der Programmierer den Nulltyp ignorieren und einfach so tun, als wäre Null lediglich ein spezielles Literal, das von einem beliebigen Referenztyp sein kann. "JLS 4.1

Was ist null?

Siehe oben. In einigen Kontexten wird null verwendet, um "kein Objekt" oder "unbekannt" oder "nicht verfügbar" zu bezeichnen, aber diese Bedeutungen sind anwendungsspezifisch.

Wie ist es in der Erinnerung dargestellt?

Das ist implementierungsspezifisch und Sie können die Darstellung von null in einem reinen Java) - Programm nicht sehen. (Aber null wird als dargestellt Null Maschinenadresse/Zeiger in den meisten, wenn nicht allen Java Implementierungen.)

30
Stephen C

Was ist null?

Es ist nichts.

Ist null eine Instanz von irgendetwas?

Nein, denn es ist nichts. Es kann keine Instanz von irgendetwas sein.

Zu welcher Menge gehört null?

Nein, egal

Wie ist es im Speicher dargestellt?

Wenn einige Hinweise darauf gefallen:

Object o=new Object();

Im Heap-Speicher wird dem neu erstellten Objekt Speicherplatz zugewiesen. Und o zeigt auf den zugewiesenen Speicherplatz im Speicher.

Jetzt o=null;

Dies bedeutet, dass jetzt o nicht auf diesen Speicherbereich des Objekts verweist.

14
Sanjay Jain

Nein, es ist nicht die Instanz von irgendetwas, instanceof wird immer falsch sein.

9
Tom

Das Schlüsselwort null ist ein Literal, das eine Nullreferenz darstellt , die sich nicht auf ein Objekt bezieht . null ist der Standardwert für Variablen vom Referenztyp.

Vielleicht auch mal anschauen

null: Java Glossar

7
Adriaan Stander

Null in Java (tm)

In C und C++ ist "NULL" eine in einer Headerdatei definierte Konstante mit einem Wert wie folgt:

    0

oder:

    0L

oder:

    ((void*)0)

abhängig von den Optionen des Compilers und des Speichermodells. NULL ist streng genommen kein Teil von C/C++.

In Java (tm) ist "null" kein Schlüsselwort, sondern ein spezielles Literal vom Typ null. Es kann in einen beliebigen Referenztyp umgewandelt werden, jedoch nicht in einen primitiven Typ wie int oder boolean. Das Null-Literal muss nicht unbedingt den Wert Null haben. Und es ist unmöglich, in den NULL-Typ umzuwandeln oder eine Variable dieses Typs zu deklarieren.

6
p27

Null ist keine Instanz einer Klasse.

Sie können jedoch Variablen eines beliebigen Typs (Objekt oder Array) den Wert null zuweisen:

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

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

Bytecode-Darstellung

Javas null hat direkte JVM-Unterstützung: Zur Implementierung werden drei Anweisungen verwendet:

  • aconst_null: Z.B. setze eine Variable auf null wie in Object o = null;
  • ifnull und ifnonnull: z.B. um ein Objekt mit null wie in if (o == null) zu vergleichen

Kapitel 6 "Der Befehlssatz Java Virtual Machine Instruction Set" erwähnt dann die Auswirkungen von null auf andere Anweisungen: Es wird ein NullPointerException ausgelöst. für viele von ihnen.

2.4. "Referenztypen und -werte" erwähnt auch null in allgemeinen Begriffen:

Ein Referenzwert kann auch die spezielle Nullreferenz sein, eine Referenz auf kein Objekt, die hier mit Null bezeichnet wird. Die Nullreferenz hat anfangs keinen Laufzeit-Typ, kann jedoch in einen beliebigen Typ umgewandelt werden. Der Standardwert eines Referenztyps ist null.

null ist ein spezieller Wert, es ist keine Instanz von irgendetwas. Aus offensichtlichen Gründen kann es nicht instanceof sein.

4
fastcodejava

null ist ein spezieller Wert, der keine Instanz einer Klasse ist. Dies wird durch das folgende Programm veranschaulicht:

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);
   }
}
3
Itay Maman

null in Java ähnelt nullptr in C++.

Programm in 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;
}

Gleiches Programm in 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");
        }
    }
}

Verstehen Sie anhand der obigen Codes, was in Java null ist? Wenn nein, empfehle ich Ihnen, Zeiger in C/C++ zu lernen, und dann werden Sie verstehen.

Beachten Sie, dass in C im Gegensatz zu C++ nullptr undefiniert ist, stattdessen jedoch NULL verwendet wird. Dies kann auch in C++ verwendet werden. In C++ ist nullptr jedoch vorzuziehen, da sich NULL in C immer auf Zeiger bezieht In C++ wurde das Suffix "ptr" an das Wortende angehängt, und auch alle Buchstaben sind jetzt in Kleinbuchstaben geschrieben, dies ist jedoch weniger wichtig.

In Java ist jede Variable der Typklasse, die nicht primitiv ist, immer ein Verweis auf ein Objekt dieses Typs oder ein geerbtes Objekt, und null ist eine Nullklassenobjektreferenz, aber kein Nullzeiger, da in Java Es gibt so etwas nicht "Zeiger", aber es werden stattdessen Verweise auf Klassenobjekte verwendet, und null in Java bezieht sich auf Klassenobjektverweise, sodass Sie es auch als bezeichnen können "nullref" oder "nullrefobj", aber das ist lang, also nenne es einfach "null".

In C++ können Sie Zeiger und den Wert nullptr für optional Mitglieder/Variablen verwenden, dh Mitglied/Variable, die keinen Wert hat, und wenn sie keinen Wert hat, dann ist sie gleich nullptr, also wie null in Java kann zum Beispiel verwendet werden.

2
user2133061

In Java gibt es zwei Hauptkategorien von Typen: primitiv und referenz. Variablen, die von einem primitiven Typ deklariert wurden, speichern Werte; Variablen, die von einem Referenztyp deklariert wurden, speichern Referenzen.

String x = null;

In diesem Fall deklariert die Initialisierungsanweisung eine Variable "x". "X" speichert die Zeichenkettenreferenz. Es ist null hier. Zunächst ist null keine gültige Objektinstanz, daher ist kein Speicher zugewiesen. Dies ist lediglich ein Wert, der angibt, dass sich die Objektreferenz derzeit nicht auf ein Objekt bezieht.

1
Anand

Kurze und präzise Antwort, die alle Ihre Fragen formell von JLS beantwortet:

3.10.7. Das Null-Literal

Der NULL-Typ hat einen Wert, die NULL-Referenz, dargestellt durch das NULL-Literal, das aus den Zeichen ASCII gebildet wird.

Ein Null-Literal ist immer vom Typ Null.

Es wird nur eine Referenz vom Typ zugeordnet, die null zugeordnet ist. Sie weisen der Referenz keinen Wert (Objekt) zu. Diese Zuordnung ist spezifisch für JVM, wie viel Referenz benötigt wird und in welchem ​​Speicherbereich sie zugeordnet wird.

0

Eine interessante Möglichkeit, in Java meiner Meinung nach null zu sehen, besteht darin, es als etwas zu betrachten, das NICHT das Fehlen von Informationen bedeutet, sondern einfach als wörtlichen Wert, der einer Referenz eines beliebigen Typs zugewiesen werden kann Wenn Sie darüber nachdenken, ob es das Fehlen von Informationen bedeutet, dann ist es für a1 == a2 nicht sinnvoll (falls beiden der Wert null zugewiesen wurde), da sie tatsächlich auf JEDES Objekt (wir) verweisen könnten Sie wissen einfach nicht, auf welche Objekte sie zeigen sollen.) Übrigens: null == null gibt in Java true zurück. Wenn Java zB wie SQL: 1999 wäre, dann null == null würde unbekannt zurückgeben (ein boolescher Wert in SQL: 1999 kann drei Werte annehmen: true, false und unknown, aber in der Praxis wird unknown in realen Systemen als null implementiert) ... http://en.wikipedia.org)/wiki/SQL

0
Bat0u89