Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在Java中使用System.err有什么不对?_Java_Static Analysis_Stderr - Fatal编程技术网

什么';在Java中使用System.err有什么不对?

什么';在Java中使用System.err有什么不对?,java,static-analysis,stderr,Java,Static Analysis,Stderr,我正在Java代码上使用Enerjy()静态代码分析器工具。它告诉我以下几行: System.err.println(“忽略该数据库”) 错误,因为它使用System.err。确切的错误是:“JAVA0267使用System.err” 使用System.err有什么问题?简短回答:将其用于日志记录目的被认为是一种不好的做法 据观察,在没有广泛可用/接受的日志框架的旧时代,每个人都使用System.err打印错误消息并将跟踪堆栈到控制台。这种方法在开发和本地测试阶段可能是合适的,但不适合于生产环境

我正在Java代码上使用Enerjy()静态代码分析器工具。它告诉我以下几行:

System.err.println(“忽略该数据库”)

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


使用System.err有什么问题?

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

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

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

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

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

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

System.err实际上更适合调试。最好以更加用户友好的方式正确处理异常和处理错误。如果用户希望看到错误,请改用System.out.println


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

错误的描述是:

System.err的使用可能表示剩余的调试代码或样板代码。考虑使用 功能齐全的日志记录包,如Apache Commons,用于处理错误日志记录

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

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

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


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

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

请查看此链接(“评论”部分)以了解更多信息


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

System.err.println和System.out.println不应用作日志记录接口。STD输出和STD错误(由System.out和.err写入)用于来自命令行工具的消息。

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


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

+1很高兴知道,谢谢。不过,我宁愿在我的应用程序中避免关机挂钩。此外,System.err不包括消息来源的信息。因此,您需要依靠人工读者来决定应该做什么。@kd304“因为您可能会丢失重要的错误消息”为什么?有没有去控制台?我遗漏了什么?@kd304你所说的“(或者你可以关闭分析选项)”是什么意思?@kd304,极客有一个有效的问题。。。为什么你说我们可能会丢失有关
System.err
的重要错误消息?“写入System.err的内容通常会在运行时丢失”--如何?@Geek,因为应用程序关闭时控制台会消失,或者根本看不见。