31.08.2013

Checkstyle - System.out | System.err | ex.printStackTrace

Der Vortrag von Dirk Weil bei der JUG Ostfalen hat mal wieder gezeigt, dass gerade die statischen Werzeuge durchaus eine wichtige Rolle in der täglichen Entwicklung spielen. Der gesamte Vortrag war eine hervorragende Auffrischung für alle die, die mit den Regeln und Möglichkeiten von PMD, Findbugs oder Checkstyle nicht unbedingt vertraut sind.

Eine spannende Möglichkeit von Checkstyle war mir bis zum Vortrag aber noch gar nicht in den Sinn gekommen. Die Überprüfung von Aufrufen von System.out / System.err / System.gc oder auch das "Logging" von Exceptions per printStackTrace.

Der Grund dafür ist sicherlich, dass es keine Standardregeln für diese Prüfungen gibt. Glücklicherweise aber existiert mit dem RegexpSingleline-Modul eine mächtige Möglichkeit mit Hilfe von regulären Ausdrücken auch diese Fälle abzudecken.

printStackTrace

Die Nutzung von printStackTrace wird durch die bestehenden IDE Einstellungen gerne als Template mit in einen catch-Block integriert. Die Ausgabe der Exception über System.err ist allerdings in den meisten Systemen zurecht nicht erlaubt. Soll die Exception ausgegeben werden, so ist ein Logging-Framework das Mittel der Wahl. Um dieses Verhalten sicher zu stellen, wird eine eigene Regel erstellt.

 

Damit ist sichergestellt, dass folgende Verfehlungen:



direkt durch Checkstyle erkannt und dokumentiert werden.



System.err | System.out

Ähnlich wie printStackTrace ist auch bei der Nutzung von System.err oder System.out ein Logging-Framework die bessere Wahl. Nicht nur, dass dort Details, wie Zeilennummern, Thread-Id oder Klasse ausgegeben werden können, kann außerdem auch zentral das Level des Loggings beeinflusst werden.



Wird also System.out oder System.err innerhalb des Codes genutzt, wird bei der Analyse durch Checkstyle der Fehler direkt erkannt und dokumentiert.





Die Regeln dafür sind mit Hilfe von regulären Ausdrücken schnell erstellt.



System.exit(int) | System.gc()

Niemand wird in webbasierten Anwendungen System.exit(int) oder System.gc() direkt aufrufen. Da es aber auch hier immer mal zu versehentlichen Aufrufen oder sonstigen Fehlern kommen kann, ist eine Überprüfung mittels Checkstyle sinnvoll. Eine wie folgt definierte Methode...



... führt automatisch zu Fehlern bei der Überprüfung.



Die zugehörigen Checkstyle-Regeln sind folgendermaßen definiert: