Warum wirft das folgende eine NullPointerException? :
%Vor%Ich weiß, wenn ich einen der folgenden Dinge tue, wird der Code keine NullPointerException auslösen:
A)
%Vor%B)
%Vor%Wenn ich den Code komplett ändere und folgendes mache, funktioniert das auch:
%Vor%Ich nehme an, der Compiler macht eine Art Optimierung und bringt die Dinge irgendwie durcheinander? Ich gehe davon aus, dass es sich um ein Casting-Problem handelt, aber warum sollte in diesem Fall eine NullPointerException anstelle einer ClassCastException ausgelöst werden? Jede Information darüber, warum dies geschieht, würde sehr geschätzt werden!
Vielen Dank im Voraus
(dieser Code ist nicht lesbar und sollte wahrscheinlich vermieden werden.), aber um tatsächlich zu antworten:
Wie oben, hat die Argumentation mit Autoboxing und Unboxing zu tun, und der Compiler führt Prüfungen durch. Es ist, als hättest du boolean b = (Boolean) null
geschrieben, was zur Laufzeit eine NPE werfen würde.
In Beispiel A wird es explizit in ein Objekt umgewandelt, sodass keine Autobox hinzugefügt wird.
In Beispiel B ist alles bereits ein Objekt (Boolean ist ein Primitiv, während Boolean ein Objekt ist), also auch hier kein Boxing oder Unboxing.
Schließlich, in Beispiel C, gibt es überhaupt kein Unboxing, und stattdessen wird das Ergebnis bei der Rückgabe nur in einem Feld angezeigt. (if-else branching erlaubt es dem Compiler, jeden Zweig einzeln zu prüfen, anstatt ternäre Operatoren, die es erfordern, die Gesamtheit der Anweisung herauszufinden und dann der ganzen Anweisung einen Typ zuzuweisen. Das hat mit Aussagen gegen Ausdrücke und einer ganzen Menge Seltsamkeit zu tun in den Java-Autoboxing- und Typprüfungsregeln.)
(Casting-Probleme treten während der Kompilierung auf, wenn Sie eine inkompatible Umwandlung wie: (Boolean) 7
oder zur Laufzeit versuchen, wenn Sie etwas wie:
Tags und Links java nullpointerexception