Stacktraces sind bei Fehlern eine sehr nützliche Erfindung. Allerdings können sie unter bestimmten Umständen die eigentliche Fehlerquelle nicht direkt benennen.

Im Vorfeld dazu folgendes einfaches Beispiel:

Exception in thread "main" java.lang.NullPointerException
    at com.goeswhere.dmnp.linenos.B.foo(B.java:13)

NullPointerException in Zeile 13. Kein Problem denken sich jetzt die meisten. Wenn die Zeile allerdings dann so aussieht, steht man wieder am Anfang: System.out.println(first.substring(1) + second.toUpperCase() + third.toLowerCase());

Der Stacktrace verrät nicht, ob nun first, second oder third null ist.

Doch dafür gibt es jetzt eine elegante Lösung. Christ West hat in seinem Faux' Blog einen Java Agent mit dem Namen LineNos vorgestellt, der dieses Problem behebt. Bei einem entsprechenden Aufruf produziert LineNos folgende Ausgabe:

java -Xbootclasspath/p:linenos.jar -javaagent:linenos.jar=com/goeswhere
com.goeswhere.dmnp.linenos.B
Exception in thread "main" java.lang.NullPointerException
    at com.goeswhere.dmnp.linenos.B.foo(B.java:13), **attempting to invoke toUpperCase** #4
    at com.goeswhere.dmnp.linenos.B.run(B.java:9)
    at com.goeswhere.dmnp.linenos.B.main(B.java:5), attempting to invoke run #2

Hier erkennt man nun direkt, dass der Aufruf toUpperCase fehlschlägt und somit second null sein muss.

blogroll
tags