War das ein Versehen? Oder hat es mit der JVM zu tun?Java: Warum werden NullPointerExceptions nicht als NullReferenceExceptions bezeichnet?
Antwort
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.
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.
Dies liegt daran, dass Java mit C-Programmierern entwickelt wurde. In C-Terminologie wird das Wort "Zeiger" anstelle von "Referenz" verwendet.
Ja, aber Java verwendet Referenz: p – hhafez
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.
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.
Warum die zufällige down-vote? –
- 1. Warum werden virtuelle Funktionen in C++ als "virtuell" bezeichnet?
- 2. Warum werden die Beobachter in Angular2-Richtlinien als Host bezeichnet?
- 3. Warum werden Formularelemente im Symfony Framework als Typen bezeichnet?
- 4. Warum wird REST als Architekturstil bezeichnet?
- 5. Sollten Pull-Requests nicht als Push-Requests bezeichnet werden?
- 6. Warum wird die Klasse subprocess.Popen nicht als Teilprozess bezeichnet?
- 7. Wie kann der Primärschlüssel als dieser bezeichnet werden, wenn er nicht als Spalte definiert ist?
- 8. Warum wird ein IoC/DI-Container als "Container" bezeichnet?
- 9. Warum wird Ruby on Rails als domänenspezifische Sprache bezeichnet?
- 10. Warum wird eine schnelle Sortierung als tailrekursiver Algorithmus bezeichnet?
- 11. Warum hat Java NullPointerException anstelle von NullReferenceException?
- 12. Warum wird AngularJS als schlecht für GUI-Editor-Apps bezeichnet?
- 13. Neo4j: Können Beziehungen bezeichnet werden?
- 14. Warum wird Kernel im maschinellen Lernen als Kernel-Funktion bezeichnet?
- 15. Warum wird MQTT als "leichtes" Messaging-Protokoll bezeichnet?
- 16. Warum wird das Marshalling-Konzept als solches bezeichnet?
- 17. Warum werden einige Microsoft-Sprachen als "visuell" bezeichnet? (Visual C#, Visual Basic .NET, Visual C++)
- 18. nicht-trivial bezeichnet initializers nicht
- 19. Abfangen von "NullPointerExceptions" in JavaScript
- 20. Wie kann ich feststellen, welcher Menüpunkt als ActionListener bezeichnet wurde?
- 21. Wie NullPointerExceptions in Struts umleiten?
- 22. Ein besserer Weg, um NullReferenceExceptions in C#
- 23. NullPointerExceptions nur auf einigen Samsung Galaxy-Geräten?
- 24. Warum werden Arrays nicht als Subtyp von Collection betrachtet?
- 25. Warum kann Konstruktor in C++ nicht als statisch deklariert werden?
- 26. Warum sollten Java-Ausnahmebehandlungsanweisungen nicht als allgemeiner Mechanismus für nicht lokales Verzweigen betrachtet werden?
- 27. Scala wird nicht als "funktionale Sprache" bezeichnet, nur weil es Turing ist.
- 28. NSOperationQueue bezeichnet Thread
- 29. Vorlagenklasse, die sich selbst als Template-Vorlagenparameter bezeichnet?
- 30. Warum wird JML nicht als Annotationen in Java implementiert?
Weil Zeiger und Referenz das gleiche ist. Es spielt keine Rolle, welches Synonym Sie nehmen, um die Idee zu repräsentieren. – Val