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.

5voto

Steven Schlansker Punkte 35955

Alternativer Vorschlag - wenn Sie Eclipse verwenden, könnten Sie einen Haltepunkt auf NullPointerException selbst setzen (in der Debug-Perspektive, gehen Sie auf die Registerkarte "Haltepunkte" und klicken Sie auf das kleine Symbol, das ein ! hat)

Aktivieren Sie sowohl die Optionen "caught" als auch "uncaught". Wenn Sie nun die NPE auslösen, wird sofort ein Haltepunkt gesetzt, und Sie können dann Schritt für Schritt nachvollziehen, wie genau die NPE behandelt wird und warum Sie keinen Stack-Trace erhalten.

2voto

Sheldon Young Punkte 29

toString() gibt nur den Namen der Ausnahme und die optionale Meldung zurück. Ich würde vorschlagen, den Aufruf von

exception.printStackTrace()

um die Nachricht zu löschen, oder wenn Sie die schmutzigen Details benötigen:

 StackTraceElement[] trace = exception.getStackTrace()

1voto

Dies wird die Exception ausgeben, verwenden Sie nur zum Debuggen Sie sollten Sie Ausnahmen besser behandeln.

import java.io.PrintWriter;
import java.io.StringWriter;
    public static String getStackTrace(Throwable t)
    {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw, true);
        t.printStackTrace(pw);
        pw.flush();
        sw.flush();
        return sw.toString();
    }

1voto

Stephen C Punkte 665668

(Ihre Frage ist immer noch unklar, ob Ihr Code die printStackTrace() oder dies wird von einem Logging-Handler erledigt).

Hier sind einige mögliche Erklärungen für das, was passiert sein könnte:

  • Der verwendete Logger/Handler wurde so konfiguriert, dass er nur die Meldungszeichenfolge der Ausnahme ausgibt, nicht aber einen vollständigen Stack-Trace.

  • Ihre Anwendung (oder eine Bibliothek eines Drittanbieters) protokolliert die Ausnahme mit LOG.error(ex); anstelle der 2-Argument-Form (zum Beispiel) der log4j-Logger-Methode.

  • Die Meldung kommt von einer anderen Stelle, als Sie denken, z. B. von einer Bibliotheksmethode eines Drittanbieters oder von zufälligem Material, das von früheren Fehlersuchversuchen übrig geblieben ist.

  • Die Ausnahme, die protokolliert wird, hat einige Methoden überladen, um den Stacktrace zu verschleiern. Wenn dies der Fall ist, ist die Ausnahme keine echte NullPointerException, sondern ein benutzerdefinierter Subtyp von NPE oder sogar eine unverbundene Ausnahme.

Ich halte die letzte mögliche Erklärung für ziemlich unwahrscheinlich, aber die Leute denken zumindest darüber nach, so etwas zu tun, um Reverse Engineering zu "verhindern". Natürlich gelingt es damit nur, ehrlichen Entwicklern das Leben schwer zu machen.

1voto

Roland Illig Punkte 379

Wenn Sie AspectJ in Ihrem Projekt verwenden, kann es vorkommen, dass ein Aspekt seinen Teil des Stack Trace ausblendet. Zum Beispiel hatte ich heute:

java.lang.NullPointerException:
  at com.company.product.MyTest.test(MyTest.java:37)

Dieser Stacktrace wurde beim Ausführen des Tests über Maven's surefire ausgegeben.

Bei der Ausführung des Tests in IntelliJ wurde hingegen ein anderer Stack-Trace ausgegeben:

java.lang.NullPointerException
  at com.company.product.library.ArgumentChecker.nonNull(ArgumentChecker.java:67)
  at ...
  at com.company.product.aspects.CheckArgumentsAspect.wrap(CheckArgumentsAspect.java:82)
  at ...
  at com.company.product.MyTest.test(MyTest.java:37)

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