459 Stimmen

NullPointerException in Java ohne StackTrace

Ich habe Instanzen unseres Java-Codes, die eine NullPointerException aber wenn ich versuche, den StackTrace zu protokollieren (was im Grunde damit endet, dass ich Throwable.printStackTrace() ), ist alles, was ich bekomme:

java.lang.NullPointerException

Hat noch jemand diese Erfahrung gemacht? Ich habe versucht, googeln für "Java Null Zeiger leeren Stack Trace" aber nicht über etwas wie dieses kommen.

590voto

Roland Illig Punkte 38839

Sie verwenden wahrscheinlich die HotSpot JVM (ursprünglich von Sun Microsystems, später von Oracle aufgekauft, Teil des OpenJDK), die viele Optimierungen vornimmt. Um die Stack Traces zurückzubekommen, müssen Sie die Option -XX:-OmitStackTraceInFastThrow an die JVM.

Die Optimierung besteht darin, dass beim erstmaligen Auftreten einer Ausnahme (in der Regel eine NullPointerException) der vollständige Stack-Trace gedruckt wird und die JVM sich den Stack-Trace (oder vielleicht nur den Ort des Codes) merkt. Wenn diese Ausnahme oft genug auftritt, wird der Stack-Trace nicht mehr ausgegeben, um eine bessere Leistung zu erzielen und das Protokoll nicht mit identischen Stack-Traces zu überfluten.

Um zu sehen, wie dies in der HotSpot JVM implementiert ist, sich eine Kopie davon besorgen und suchen Sie nach der globalen Variable OmitStackTraceInFastThrow . Das letzte Mal, als ich mir den Code ansah (im Jahr 2019), befand er sich in der Datei graphKit.cpp .

71voto

Steven Schlansker Punkte 35955

Wie Sie in einem Kommentar erwähnt haben, verwenden Sie log4j. Ich habe (versehentlich) eine Stelle entdeckt, an der ich geschrieben hatte

LOG.error(exc);

anstelle des typischen

LOG.error("Some informative message", e);

aus Faulheit oder weil sie nicht darüber nachdenken. Das Bedauerliche daran ist, dass es sich nicht so verhält, wie Sie es erwarten. Die Logger-API nimmt tatsächlich Object als erstes Argument, nicht eine Zeichenkette - und ruft dann toString() für das Argument auf. Anstatt also einen hübschen Stack-Trace zu erhalten, wird nur der toString ausgedruckt - was im Fall von NPE ziemlich nutzlos ist.

Vielleicht ist es das, was Sie gerade erleben?

37voto

Matt Solnit Punkte 29896

Wir haben dieses Verhalten bereits in der Vergangenheit beobachtet. Es stellte sich heraus, dass aus irgendeinem verrückten Grund, wenn eine NullPointerException an der gleichen Stelle im Code mehrmals auftrat, nach einer Weile mit Log.error(String, Throwable) keine vollständigen Stack Traces mehr enthalten.

Versuchen Sie, weiter hinten in Ihrem Protokoll zu suchen. Vielleicht finden Sie den Übeltäter.

EDITAR: dieser Fehler klingt relevant, aber es wurde vor so langer Zeit behoben, dass es wahrscheinlich nicht die Ursache ist.

24voto

Benoît Guérout Punkte 1937

Hier ist eine Erklärung: Hotspot führte dazu, dass Ausnahmen in der Produktion ihre Stack Traces verloren - und die Lösung

Ich habe es auf Mac OS X getestet

  • java version "1.6.0_26"
  • Java(TM) SE-Laufzeitumgebung (Build 1.6.0_26-b03-383-11A511)
  • Java HotSpot(TM) 64-Bit Server VM (Build 20.1-b02-383, gemischter Modus)

    Object string = "abcd";
    int i = 0;
    while (i < 12289) {
        i++;
        try {
            Integer a = (Integer) string;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Für dieses spezielle Codefragment scheinen 12288 Iterationen (+Häufigkeit?) die Grenze zu sein, bei der die JVM beschlossen hat, eine vorab zugewiesene Ausnahme zu verwenden...

11voto

Peter Lang Punkte 52229

exception.toString gibt Ihnen nicht den StackTrace, sondern nur zurück

eine kurze Beschreibung dieses Wurfobjekts. Das Ergebnis ist die Verkettung von:

* the name of the class of this object
* ": " (a colon and a space)
* the result of invoking this object's getLocalizedMessage() method

Verwenden Sie exception.printStackTrace um den StackTrace auszugeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X