2016-04-30 6 views

Antwort

4

Es gibt zwei Möglichkeiten, wie die JVM zu „erkennen“, die NULL-Werte nutzen könnten.

  • Es könnte explizit testen. Dies stellt einen Overhead dar, aber der JIT könnte einige der Tests optimieren; z.B. Wenn eine Methode eine Methode auf this aufruft, kann sie keine NPE geben, und wenn ein Aufruf unter Verwendung einer gidem-Referenz nicht NPE, dann wird auch eine andere nicht.

  • Es könnte es mit virtueller Speicher-Hardware implementieren. Die JVM ordnet an, dass die Seite null in ihrem virtuellen Adressraum einer Seite zugeordnet wird, die nicht lesbar + nicht schreibbar ist. Da null als Null dargestellt wird, wenn Java-Code versucht, null zu dereferenzieren, führt dies dazu, dass ein "segfault" -Signal an die JVM geliefert wird. Der JVM-Segmentierungssignal-Handler kann dies auffangen, herausfinden, wo der Code ausgeführt wurde, und eine NPE auf dem Stapel des aktuellen Threads erstellen und werfen.

    Dies ist kompliziert und ziemlich teuer, aber das ist nicht wichtig, weil NPEs in einem normalen Programm selten sein sollten.

+0

In Hotspot werden beide Ansätze basierend auf Typ/Nullheitsprofilinformationen verwendet – the8472

0

NULLPointerException ist im Grunde eine Laufzeitausnahme, d. H. JVM erwartet, dass ein reales Objekt referenziert wird, wenn Sie eine Operation ausführen.

Um dies besser zu verstehen, müssen Sie wissen, wie Objekt erstellt und in java.Here verwiesen wird. Hier ist die Syntax: myClass o = new myClass();

In diesem Fall wird ein Objekt im Heap-Speicherbereich mit o als Verweis auf dieses Objekt erstellt, d. H. O zeigt im Wesentlichen auf dieses Objekt. Während der Laufzeit ermittelt JVM das tatsächliche Objekt, auf das o gezeigt wird, und verwendet dieses zum Ausführen der Operation.

So können nur sagen, Sie haben eine Methode doSomething() als Instanzmethode für die oben myClass defintion, und Sie nennen es wie diese o.doSomething(), so JVM wird das eigentliche Objekt finden und diese Methode aufgerufen.

Aber wenn Sie setzen o = null; dann zeigt o nicht auf das tatsächliche Objekt von myclass, d. h. o zeigt auf nichts. So jetzt während der Ausführung von o.doSomething, JVM herausfinden, dass o auf nichts zeigt und löst die Laufzeit Ausnahme NULLPointerException in diesem Fall.

Es ist nicht langsam, weil sie die Art und Weise JVM entwickelt wird, auf den tatsächlichen referenzierte Objekte zu arbeiten, die zur Laufzeit geschieht und wenn Sie nicht den NULL-Check proeprly in Ihrem Programm und Nullpointer von JVM geworfen werden Handling dann Ihrem Programm stürzt ab und jvm endet.

sehen java doc für weitere Informationen: http://docs.oracle.com/javase/7/docs/api/java/lang/NullPointerException.html