Frage

ich die Enerjy bin mit ( http://www.enerjy.com/ ) statischer Code-Analysator Werkzeug auf meinem Java-Code. Es sagt mir, dass die folgende Zeile ein:

System.err.println ( "Ignoriert die Datenbank");

ist schlecht, weil es System.err verwendet. Der genaue Fehler ist: "JAVA0267 Verwendung von System.err"

Was ist falsch mit der Verwendung von System.err?

War es hilfreich?

Lösung

Kurze Antwort:. Es ist eine schlechte Praxis betrachtet es zur Protokollierung verwenden

Es ist eine Beobachtung, dass in den alten Zeiten, als dort, wo kein allgemein verfügbar / akzeptiert Logging Frameworks, jeder System.err verwendet, um Fehlermeldungen zu drucken und stapeln Spuren auf die Konsole. Dieser Ansatz könnte bei der Entwicklung und die lokalen Testphase angemessen sein, ist aber nicht geeignet für eine Produktionsumgebung, da Sie wichtige Fehlermeldungen verlieren könnten. Aus diesem Grund, in fast allen statischen Analysetools heute diese Art von Code erkannt und markiert als schlechte Praxis (oder ähnlich benannten Problem).

Logging Frameworks wiederum bieten die strukturierte und logische Art und Weise Ihre Ereignisse und Fehlermeldungen zu protokollieren, als sie die Nachricht in verschiedenen hartnäckigen Stellen speichern kann (Log-Datei, log db, usw.).

Der offensichtlichste (und frei von externen Abhängigkeiten) Hack Auflösung ist die in Java Logging-Framework durch die java.util.logging.Logger Klasse gebaut zu verwenden, da es die Protokollierung von Ereignissen an die Konsole standardmäßig weiterleitet. Zum Beispiel:

final Logger log = Logger.getLogger(getClass().getName());
...
log.log(Level.ERROR, "Something went wrong", theException);

(oder man könnte einfach abschalten, dass die Analyse-Option)

Andere Tipps

der Descriptor Ihres Fehler ist:

  

Die Verwendung von System.err kann Rest debug oder Textcode an. Betrachten wir ein mit   voll funktions Logging-Paket wie Apache Commons Fehlerprotokollierung zu behandeln.

Es scheint, dass Sie System.err zur Protokollierung verwenden, das ist suboptimal aus mehreren Gründen:

  • es ist unmöglich, die Protokollierung zur Laufzeit zu ermöglichen, ohne die Anwendung binär zu Modifizieren
  • Logging-Verhalten kann nicht durch Bearbeiten einer Konfigurationsdatei
  • gesteuert werden
  • problably viele andere

Während ich mit den Punkten oben über die Verwendung eine Logging-Framework zustimmen, neige ich dazu noch System.err Ausgang an einem Ort zu verwenden: In der Shut-down Haken. Dies liegt daran, dass ich entdeckt bei der Verwendung der Protokollanweisungen java.util.logging Rahmen werden nicht immer angezeigt, wenn sie in Abstellzeit Haken auftreten. Dies liegt daran, die Logging-Bibliothek einen eigenen Shutdown-Hook vermutlich enthält Protokolldateien und andere Ressourcen zu bereinigen, und wie Sie sich nicht auf die Reihenfolge verlassen, in dem Shutdown-Haken ausführen, können Sie nicht auf java.util.logging Aussagen verlassen wie erwartet.

diesen Link Check out (der Abschnitt "Kommentare") für weitere Informationen zu diesem Thema.

http://weblogs.java.net/blog/ dwalend / Archiv / 2004/05 / shutdown_hooks_2.html

(Offensichtlich ist die andere Alternative ist eine andere Logging-Framework zu verwenden.)

System.err ist wirklich mehr für Debugging-Zwecke als alles andere. Die richtige Ausnahmebehandlung und den Umgang mit Fehlern in einer Weise, die benutzerfreundlicher ist bevorzugt ist. Wenn der Benutzer gemeint ist, um den Fehler zu sehen, verwenden Sie einen System.out.printin statt.

Wenn Sie den Überblick über diese Fehler von einem Entwickler Standpunkt behalten möchten, sollten Sie einen Logger verwenden.

Reise System.err geschrieben wird in der Regel zur Laufzeit verloren, so ist es eine bessere Praxis als eine Logging-Framework zu verwenden, die flexibler darüber, wo die Ausgabe die Nachricht, so dass es als eine Datei und analysiert gespeichert werden kann.

System.err und System.out für Nicht-Konsole-Anwendungen werden immer nur vom Entwickler gesehen den Code in seinen IDE ausgeführt wird, und nützliche Informationen verloren gehen können, wenn das Element in der Produktion ausgelöst wird.

System.err.println und System.out.printin sollen nicht als loggging-Schnittstelle verwendet werden. STD-Output und STD-Error (diese werden von System.out geschrieben und err) ist für Nachrichten von Kommandozeilen-Tool.

System.err druckt an die Konsole. Dies kann für einen Studenten zu testen, ihre Hausaufgaben geeignet sein, aber für eine Anwendung nicht geeignet sein, wo diese Nachrichten nicht (Konsole speichern, so viele Zeilen nur) zu sehen.

Ein besserer Ansatz wäre eine Ausnahme zu werfen, die Nachricht hält, die normalerweise an die Konsole geschickt bekommen würde. Eine Alternative dazu sein Dritte Logging-Software verwenden würde, die diese Nachrichten in einer Datei gespeichert werden sollten, die für immer gespeichert werden kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top