(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
  • 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

Schreibe einen Kommentar