在Java中使用System.err有什么问题?

use*_*807 11 java static-analysis stderr

我在我的Java代码上使用Enerjy(http://www.enerjy.com/)静态代码分析器工具.它告诉我以下行:

System.err.println("忽略该数据库");

是坏的,因为它使用System.err.确切的错误是:"JAVA0267使用System.err"

使用System.err有什么问题?

aka*_*okd 22

简短回答:将它用于记录目的被认为是一种不好的做法.

这是一个观察,在旧时没有广泛可用/接受的日志框架,每个人都使用System.err打印错误消息和堆栈跟踪到控制台.这种方法在开发和本地测试阶段可能是合适的,但不适合生产环境,因为您可能会丢失重要的错误消息.因此,在今天的几乎所有静态分析工具中,都会检测到这种代码并将其标记为不良实践(或类似命名的问题).

日志框架反过来提供了记录事件和错误消息的结构化和逻辑方式,因为它们可以将消息存储在各种持久位置(日志文件,日志数据库等).

最明显的(和自由外部依赖的)黑客分辨率是通过使用内置的Java记录框架java.util.logging.Logger类的默认转发的事件记录到控制台.例如:

final Logger log = Logger.getLogger(getClass().getName());
...
log.log(Level.ERROR, "Something went wrong", theException);
Run Code Online (Sandbox Code Playgroud)

(或者您可以关闭该分析选项)

  • 另外,System.err不包含消息来自的信息.因此,你依赖于人类读者来确定应该做什么,如果有的话. (2认同)

dfa*_*dfa 7

您的错误描述符是:

System.err的使用可能表示残留的调试或样板代码.考虑使用功能齐全的日志包(如Apache Commons)来处理错误日志记录.

您似乎使用System.err进行日志记录,由于以下几个原因,这是次优的:

  • 如果不修改应用程序二进制文件,就无法在运行时启用日志记录
  • 通过编辑配置文件无法控制日志记录行为
  • 可能很多其他人


Ada*_*ski 7

虽然我同意上面关于使用日志框架的观点,但我仍倾向于System.err在一个地方使用输出:在关闭钩子中.这是因为我发现在使用java.util.logging框架时,如果日志语句出现在关闭挂钩中,则它们并不总是显示.这是因为日志库可能包含自己的关闭挂钩来清理日志文件和其他资源,并且由于您不能依赖关闭挂钩运行的顺序,因此您不能依赖于java.util.logging按预期工作的语句.

查看此链接("评论"部分)以获取更多相关信息.

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

(显然另一种选择是使用不同的日志框架.)