11

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

System.err.println("忽略了那个数据库");

不好,因为它使用 System.err。确切的错误是:“JAVA0267 使用 System.err”

使用 System.err 有什么问题?

4

7 回答 7

22

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

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

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

最明显(并且没有外部依赖)的破解解决方案是通过java.util.logging.Logger类使用内置的 Java Logging 框架,因为它默认将日志记录事件转发到控制台。例如:

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

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

于 2009-06-26T15:36:29.743 回答
7

你的错误描述是:

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

似乎您正在使用 System.err 进行日志记录,这不是最理想的,原因如下:

  • 如果不修改应用程序二进制文件,就不可能在运行时启用日志记录
  • 无法通过编辑配置文件来控制日志记录行为
  • 可能还有很多其他人
于 2009-06-26T15:40:46.880 回答
7

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

查看此链接(“评论”部分)以获取更多信息。

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

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

于 2009-06-26T16:11:20.583 回答
2

System.err 实际上更多的是用于调试目的。最好以对用户更友好的方式进行适当的异常处理和错误处理。如果用户打算看到错误,请改用 System.out.println。

如果您想从开发人员的角度跟踪这些错误,您应该使用记录器。

于 2009-06-26T15:37:11.490 回答
1

写入 System.err 的内容通常会在运行时丢失,因此使用更灵活的日志框架被认为是一种更好的做法,该框架可以更灵活地输出消息的位置,因此可以将其存储为文件并进行分析。

非控制台应用程序的 System.err 和 System.out 只有在其 IDE 中运行代码的开发人员才能看到,如果在生产中触发该项目,有用的信息可能会丢失。

于 2009-06-26T15:40:58.173 回答
1

System.err.println 和 System.out.println 不应用作日志接口。STD-Output 和 STD-Error(由 System.out 和 .err 编写)用于来自命令行工具的消息。

于 2009-06-26T16:15:47.793 回答
0

System.err 打印到控制台。这可能适合学生测试他们的作业,但不适用于不会看到这些消息的应用程序(控制台只存储这么多行)。

更好的方法是抛出一个异常,该异常包含通常会发送到控制台的消息。对此的替代方法是使用第三方日志记录软件,该软件会将这些消息存储在可以永久存储的文件中。

于 2009-06-26T16:32:24.787 回答