Tipp: Informativere Debug-Meldungen ausgeben

javabar

Mitglied
Bisher verwendete ich immer System.out.println(), um irgendwelche Werte zur Kontrolle und Fehlersuche auf der Konsole auszugeben.

Danach war ich oft damit beschäftigt, nach diesen System.out.println()'s zu suchen und diese wieder zu entfernen, :autsch:

Ich dachte, schade, dass es in Java keine so "magischen Variablen" wie "__FILE__" und "__LINE__" wie in PHP gibt...

Bei Google-Suche fand ich in diesem Artikel, dass es in Java noch etwas besseres gibt, und zwar die Klasse Throwable. :)

Ich entwickelte mir diesen Code, um Debug-Meldungen mit der aufrufenden Klasse + Zeilennummer auszugeben:

Java:
package debug;

public class Debugger {

    public static void print(Object o) {
        _print(new Throwable(), null, o);
    }

    public static void print(String name, Object o) {
        _print(new Throwable(), name, o);
    }

    public static void print(long l) {
        _print(new Throwable(), null, new Long(l));
    }

    public static void print(String name, long l) {
        _print(new Throwable(), name, new Long(l));
    }

    public static void print(double d) {
        _print(new Throwable(), null, new Double(d));
    }

    public static void print(String name, double d) {
        _print(new Throwable(), name, new Double(d));
    }

    public static void print(float f) {
        _print(new Throwable(), null, new Float(f));
    }

    public static void print(String name, float f) {
        _print(new Throwable(), name, new Float(f));
    }

    public static void print(boolean b) {
        _print(new Throwable(), null, b);
    }

    public static void print(String name, boolean b) {
        _print(new Throwable(), name, b);
    }

    private static void _print(Throwable t, String name, Object o) {
        StackTraceElement e = t.getStackTrace()[1];

        StringBuilder sb = new StringBuilder();
        sb.append("output from ").append(e.getClassName()).append(".").append(e.getMethodName()).append("() in line ").append(e.getLineNumber()).append(":\n");
        if (name != null) {
            sb.append(name).append(" = ");
        }

        if (o == null) {
            sb.append("null");
        } else {
            sb.append(o.toString());
        }

        java.util.logging.Logger.getLogger(Debugger.class.getName()).log(java.util.logging.Level.INFO, sb.toString());
        // Wer lieber System.out.println verwenden möchte:
        //System.out.println(sb);

    }
}

Die Ausgabe erfolgt über debug.Debugger.print(variable) oder debug.Debugger.print(String name, variable), wobei "variable" ein beliebiges Objekt oder primitiver Datentyp sein kann.

Zum Test/Demo ein HelloWorld.java:

Java:
package demo;

public class HelloWorld {

    public static void main(String[] args) {
        debug.Debugger.print("Hello World!");
        debug.Debugger.print("Math.PI", Math.PI);
        debug.Debugger.print("today", new java.util.Date());
        debug.Debugger.print("nullobject", null);
    }
}

gibt aus:

Code:
18.01.2012 01:49:41 debug.Debugger _print
INFO: output from demo.HelloWorld.main() in line 6:
Hello World!
18.01.2012 01:49:41 debug.Debugger _print
INFO: output from demo.HelloWorld.main() in line 7:
Math.PI = 3.141592653589793
18.01.2012 01:49:41 debug.Debugger _print
INFO: output from demo.HelloWorld.main() in line 8:
today = Wed Jan 18 01:49:41 CET 2012
18.01.2012 01:49:41 debug.Debugger _print
INFO: output from demo.HelloWorld.main() in line 9:
nullobject = null

Ich hoffe, das hilft einigen, ansonsten - Verbesserungsvorschläge sind gerne willkommen.

Viele Grüße

Egon
 

HimBromBeere

Top Contributor
Das ist doch mal was Brauchbares... werde ich bei mir in ähnlicher Form mal anwenden, sind ja doch schon ein paar tausen Codezeilen mittlerweile, die verwaltet werden wollen???:L...
 
B

bygones

Gast
ach herrje... fangt bitte nun nicht an das wirklich zu nutzen.

um code zu testen gibt es tests, keinen debugger.
um code zu debuggen bietet jede IDE einen debugger
um zu loggen gibt es logging frameworks.

Das Throwable system fuer debug ausgaben zu missbrauchen ist nicht noetig.
 

HimBromBeere

Top Contributor
keine Ahnung... hab nisher nur die sysout-Variante verwendet, die mir mein Eclipse bot. Bisher war das alles nur debugging, da alles nöch in Entwicklung. Mit den Logging-Frameworks kenn ich mich nicht aus...
 
I

irgendjemand

Gast
jetzt wirds ja lustig ... exception-handling zum debuggen missbrauchen ...

@TO
sry ... aber dafür gibt es gute debugger oder man schreibt in seine sys-outs selbst dateiname und zeilennummer ...

selbst wenn man sowas dafür missbrauchen sollte ist Throwable definitiv die falsche klasse ... allerhöchstens eine von RuntimeException abgeleitete klasse ...
Throwable ist in sofern das problem das du damit wirklich ALLES was irgendwie an fehlern von java geworfen werden kann fangen würdest ... und dazu zählen auch alle von Error abgeleiteten klassen *was meines erachtens nur in extremen ausnahme-fällen sinn macht* ...
alles was NICHT von RuntimeException erbt *also alle checked Exceptions* musst du so oder so fangen ... sonst meckert schon der compiler und weigert sich den code überhaupt zu übersetzen ...
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben