2008-09-19 10 views

Antwort

26

Java hat tatsächlich Zeiger - Zeiger, auf denen Sie Zeigerarithmetik nicht ausführen können.

Vom ehrwürdigen JLS:

Es gibt zwei Arten von Typen in der Programmiersprache Java: primitive Typen (§4.2) und Referenz-Typen (§4.3). Entsprechend gibt es zwei Arten von Datenwerten, die in Variablen gespeichert, als Argumente übergeben, von Methoden zurückgegeben und bearbeitet werden können: Grundwerte (§4.2) und Referenzwerte (§4.3).

Und later:

Ein Objekt ist eineKlasseninstanz oder Array.

Die Referenzwerte (oft nur Referenzen) sind Zeiger auf diese Objekte und eine spezielle Nullreferenz, die auf kein Objekt verweist.

(Schwerpunkt ihrer)

Also, zu interpretieren, wenn Sie schreiben:

Object myObj = new Object(); 

dann ist myObj ein Referenztyp, die einen Referenzwert enthält, die selbst ist ein Zeiger auf die neu erstellte Object.

Wenn Sie also myObj auf null setzen Sie die Einstellung der Referenzwert (aka Zeiger) zu null. Daher wird eine NullPointerException vernünftigerweise ausgelöst, wenn die Variable dereferenziert wird.

Keine Sorge: Dieses Thema wurde zuvor heartily debated.

1

Ich denke, es hat mit der Tatsache zu tun, dass die JVM in C++ codiert ist. Abgesehen davon sind Zeiger und Referenzen fast gleich. Man könnte sagen, dass der Referenzmechanismus in Java mit C++ - Zeigern implementiert wird und der Name "NullPointerException" das Durchleuchten dieser Implementierungsdetails ermöglicht.

0

Dies liegt daran, dass Java mit C-Programmierern entwickelt wurde. In C-Terminologie wird das Wort "Zeiger" anstelle von "Referenz" verwendet.

+0

Ja, aber Java verwendet Referenz: p – hhafez

3

In Java verwenden sie die Nomenklatur REFERENCE, um auf dynamisch erstellte Objekte zu verweisen. In früheren Sprachen heißt es POINTER. Genauso wie die Benennung von METHODS in objektorientierten Sprachen von früheren FUNCTIONs und PROCEDURE's in früheren (objektorientierten sowie nicht objektorientierten) Sprachen übernommen wurde.Es gibt kein bestimmtes besser oder schlechter in dieser Benennung oder neuen Norm, es ist nur eine andere Art, das Phänomen zu benennen, in der Lage zu sein, frühere dynamische Objekte zu erzeugen, die in der Luft hängen (Heap Space) und auf die eine feste Objektreferenz bezogen wird (oder dynamische Referenz, die auch in der Luft hängt). Die Autoren des neuen Standards (Verwendung von METHODEN und REFERENZEN) erwähnten insbesondere, dass die neuen Standards implementiert wurden, um sie konform zu den kommenden Planungssystemen zu machen - wie UML und UP, wo die Verwendung der objektorientierten Terminologie die Verwendung von ATTRIBUTES vorschreibt. Methoden und Referenzen, und nicht Variablen, Funktionen und Zeiger.

Jetzt denken Sie vielleicht, dass es nur eine Umbenennung war, aber das würde die Beschreibung des Prozesses vereinfachen und nicht nur zu dem langen Weg, den die Sprachen im Namen der Entwicklung genommen haben. Eine Methode unterscheidet sich von einer Prozedur dadurch, dass sie innerhalb eines Bereichs einer Klasse arbeitet, während die Prozedur von Natur aus auf dem globalen Umfang basiert. In ähnlicher Weise ist ein Attribut nicht nur ein neuer Name für eine Variable, da das Attribut eine Eigenschaft einer Klasse (und ihrer Instanz - ein Objekt) ist. In ähnlicher Weise ist der Bezug, der die Frage hinter diesem kleinen Schreiben hier ist, anders, da er typisiert ist, daher hat er nicht die typische Eigenschaft von Zeigern, da er eine rohe Bezugnahme auf Speicherzellen ist speicherbasierte Objekte.

Nun, innerhalb von Java, das ist - im Magen von Java, gibt es eine Arbitrationsebene zwischen dem zugrunde liegenden C-Code und dem Java-Code (die virtuelle Maschine). In dieser Arbitrierungsschicht erfolgt eine Abstraktion dadurch, dass die darunter liegende (Bare-Metal) Implementierung der Referenzen, wie sie von der virtuellen Maschine durchgeführt wird, die Referenzen vor referenziertem Bare-Metal schützt (Speicherzellen ohne Struktur). Die rohe Wahrheit ist daher, dass die NullPointerException wirklich eine Null-Zeiger-Ausnahme ist und nicht nur eine Null-Referenz-Ausnahme. Diese Wahrheit kann jedoch für den Programmierer in der Java-Umgebung völlig irrelevant sein, da er zu keinem Zeitpunkt in Kontakt mit der Bare-Metal-JVM steht.

1

Ich denke, dass die Antwort ist, dass wir die wirkliche Antwort nie wirklich wissen werden.

Ich vermute, dass einige Zeit, bevor Java 1.0 veröffentlicht wurde, jemand eine Klasse namens NullPointerException definiert. Entweder hat diese Person den Namen falsch verstanden, oder die Terminologie hatte sich nicht stabilisiert; d.h. die Entscheidung, den Ausdruck "Referenz" anstelle von "Zeiger" zu verwenden, wurde nicht getroffen.

In jedem Fall ist es wahrscheinlich, dass niemand bemerkt hat, dass die Inkonsistenz nicht behoben werden konnte, ohne die Rückwärtskompatibilität zu beeinträchtigen. Es gibt andere kleinere Unstimmigkeiten wie diese, wenn Sie wirklich hart schauen. Und einige ernstere Probleme, die aus dem gleichen Grund nicht behoben werden konnten.

Aber das ist nur Vermutung.

+0

Warum die zufällige down-vote? –

Verwandte Themen