(Unbekannte Quelle) im Exception-Stack-Trace
Hintergrund
Diese Frage ist in Bezug auf Warum String.valueOf(null) werfen einer NullPointerException?
Betrachten Sie den folgenden Codeausschnitt:
public class StringValueOfNull {
public static void main(String[] args) {
String.valueOf(null);
//programmer intention is to invoke valueOf(Object), but instead
//code invokes valueOf(char[]) and throws NullPointerException
}
}
Wie bereits in der Antwort auf die verlinkte Frage, Java ist die Methode überladen behebt die oben genannten Aufruf zu - String.valueOf(char[])
die zu Recht die Ergebnisse in einem NullPointerException
zur Laufzeit.
Zusammengestellt in Eclipse und javac 1.6.0_17
dies ist die Stapelüberwachung:
Exception in thread "main" java.lang.NullPointerException
at java.lang.String.<init>(Unknown Source)
at java.lang.String.valueOf(Unknown Source)
at StringValueOfNull.main(StringValueOfNull.java:3)
Beachten Sie, dass die stack-trace-oben fehlt der SCHLÜSSEL Informationen: es hat NICHT haben die vollständige Signatur der valueOf
Methode! Es sagt nur String.valueOf(Unknown Source)
!
In den meisten Situationen, die ich erlebt habe, exception-stack-traces haben Sie immer die vollständige Signatur der Methoden, die tatsächlich in dem stack-trace, das ist natürlich sehr hilfreich identifizieren Sie das problem sofort und ein wesentlicher Grund, warum der stack-trace (unnötig zu sagen, ist eher teuer zu konstruieren) ist in den ersten Platz.
Und doch, in diesem Fall der stack-trace hilft dabei überhaupt nicht. Es hat kläglich versagt bei der Unterstützung der Programmierer das problem zu identifizieren.
Da ist, sehe ich 3 Möglichkeiten, die ein Programmierer kann erkennen, das problem mit dem obigen snippet:
- Programmierer erkennt auf seinem/Ihrem eigenen, dass die Methode ist überladen, und durch die Entschließung der Regel der "falschen" überlast wird aufgerufen, in diesem Fall
- Programmierer verwendet eine gute IDE, erlaubt ihm/Ihr, um schnell zu sehen, welche Methode ausgewählt wird
- In Eclipse, zum Beispiel, bewegen Sie die Maus schweben auf den obigen Ausdruck schnell erzählt Programmierer, die
String valueOf(char[] data)
ist ja die eine ausgewählte
- In Eclipse, zum Beispiel, bewegen Sie die Maus schweben auf den obigen Ausdruck schnell erzählt Programmierer, die
- Programmierer untersucht den bytecode (ugh!)
Die Letzte option ist wahrscheinlich die am wenigsten zugängliche, aber natürlich ist die Ultimative Antwort (ein Programmierer wird vielleicht falsch verstanden, die überlastung Regel, IDE kann buggy sein, aber bytecodes immer(?) die Wahrheit sagen, was gemacht wird).
Die Fragen
- Warum ist der stack-trace, so Informationswert in diesem Fall mit Bezug auf die Signaturen der Methoden, die tatsächlich in dem stack-trace?
- Wird dies durch den compiler? Die Laufzeit? Etwas anderes?
- In dem, was andere (seltene?) Szenarien können der stack-trace nicht erfasst wesentliche Informationen wie diese?
InformationsquelleAutor der Frage polygenelubricants | 2010-06-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist normalerweise im Zusammenhang mit fehlenden debug-Informationen. Sie sind wahrscheinlich über JRE (nicht JDK), die keine debug-Informationen für rt.jar Klassen. Versuchen Sie es mit vollen JDK, bekommen Sie die richtigen stellen im stack trace:
InformationsquelleAutor der Antwort unbeli
Beachten Sie, dass wenn Sie mit Ant-build-und wenn das debug-Attribut auf false festgelegt, in der javac-Befehl dies geschehen könnte.
ex : wenn Sie die richtige Lage in den trace-Satz debug = true in der Ant-build -,
InformationsquelleAutor der Antwort Supun Sameera
Ich hatte das gleiche problem, ich bin mit Frühjahr und apache ant für die kontinuierliche integration.
Den Fehler den ich hatte, war in der build.xml Datei.
Die gender-change-log mit genauer Inhalt war:
build.xml mit der Fehlermeldung:
build.xml ohne Fehler:
Innerhalb der Struktur fehlte mir der Mut debug = "true"
InformationsquelleAutor der Antwort jamlhet
Lief ich den code in Eclipse und ich bekam die folgende Ausgabe,
Wenn Sie die vollständige Quelle (aus dem JDK), kann man eigentlich Debuggen auf die Zeile 177 in String.java
InformationsquelleAutor der Antwort bragboy
Dies geschieht, wenn es keine debug - (line -) Informationen in der Quell-oder der VM sagte zu werfen, dass die Informationen entfernt, die von der Klasse Ladezeit. Da haben Sie einige Zeilennummern, es ist nicht die VM-Einstellung, aber die Klasse
String
fehlt debug-Informationen.InformationsquelleAutor der Antwort Aaron Digulla
In Eclipse: Einstellungen - > Java - > Installierte JREs. Die geprüften Eintrag sollte einen Pfad innerhalb des JDK, z.B. C:\Program Files (x86)\Java\jdk1.7.0_55\jre.
InformationsquelleAutor der Antwort Peter Tseng