导致运行时异常在控制台输出中使用 println 正确排序

2024-01-30

VM Java 控制台输出的一个常见问题是 System.out 和 System.err 通常未正确同步,可能是因为它们位于不同的线程上。这会导致混合输出,如下所示:

调试输出与运行时异常堆栈跟踪混合在一起

[8, 1, 3, 5, 9, 13, 15, 17, 19]
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 9
scanning xAnswer: 1 xValue: 1 total: 1 [1, 1, 0, 0, 0, 0, 0, 0, 0]
    at cra.common.Group_jsc.listSubsetSum(Group_jsc.java:29)
scanning xAnswer: 2 xValue: 2 total: 4 [2, 1, 2, 0, 0, 0, 0, 0, 0]
    at cra.common.Group_jsc.main(Group_jsc.java:12)
scanning xAnswer: 3 xValue: 3 total: 9 [3, 1, 2, 3, 0, 0, 0, 0, 0]
scanning xAnswer: 4 xValue: 4 total: 18 [4, 1, 2, 3, 4, 0, 0, 0, 0]
scanning xAnswer: 5 xValue: 5 total: 31 [5, 1, 2, 3, 4, 5, 0, 0, 0]
  reset to xAnswer: 4 xValue: 5 total: 26 [4, 1, 2, 3, 5, 5, 0, 0, 0]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
scanning xAnswer: 5 xValue: 6 total: 41 [5, 1, 2, 3, 5, 6, 0, 0, 0]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  reset to xAnswer: 4 xValue: 6 total: 35 [4, 1, 2, 3, 6, 6, 0, 0, 0]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
scanning xAnswer: 5 xValue: 7 total: 52 [5, 1, 2, 3, 6, 7, 0, 0, 0]
  reset to xAnswer: 4 xValue: 7 total: 45 [4, 1, 2, 3, 7, 7, 0, 0, 0]
scanning xAnswer: 5 xValue: 8 total: 64 [5, 1, 2, 3, 7, 8, 0, 0, 0]
  reset to xAnswer: 4 xValue: 8 total: 56 [4, 1, 2, 3, 8, 8, 0, 0, 0]

Process finished with exit code 1

由于异常发生在进程结束时,我希望打印出异常AFTER程序中的所有 println 。为什么会发生这种情况以及可以采取哪些措施来纠正该问题?

(请注意,这个特定示例来自 IntelliJ 的 IDEA 控制台,但在 Eclipse 和其他 Java IDE 中也会发生同样的情况)


VM Java 控制台输出的一个常见问题是 System.out 和 System.err 通常未正确同步,

不,它们完美同步。问题是lines混合在一起,因为它们被打印为单独的调用println(...)。这是来自的代码Exception.printStackTrace():

        StackTraceElement[] trace = getOurStackTrace();
        for (int i=0; i < trace.length; i++)
            s.println("\tat " + trace[i]);

记录器(如 log4j)获取完整的堆栈跟踪并将多行转换为单个日志输出调用,然后以原子方式持久保存。

为什么会发生这种情况以及可以采取哪些措施来纠正该问题?

通常,对于 Unix 程序,标准输出会被缓冲,而标准错误则不会。我不认为 Java 是这样,但也许确实如此。阅读 javadocSystem.out:

“标准”输出流。该流已打开并准备好接受输出数据。通常,该流对应于显示输出或由主机环境或用户指定的另一个输出目的地。

与为System.err:

按照惯例,该输出流用于显示错误消息 或其他应立即引起注意的信息 即使主要输出流,用户的值 多变的out,已被重定向到文件或其他 通常不会持续监控的目的地。

请参阅此答案了解更多详细信息:为什么有时会先打印 System.err 语句? https://stackoverflow.com/questions/9146257/why-do-system-err-statements-get-printed-first-sometimes/9146264#9146264

如果从命令行运行,您应该将 out 和 err 输出重定向到不同的文件。以下是使用 ~unix 执行此操作的方法:

如何将 stderr 和 stdout 重定向到 bash 同一行中的不同文件? https://stackoverflow.com/questions/7901517/how-to-redirect-stderr-and-stdout-to-different-files-in-the-same-line-of-bash

在Java中你可以使用System.setOut(...) and System.setErr(...)将不同的输出发送到不同的PrintStream这样线条就不会交错。


您编辑了问题以注意到这是在 IDE 内部发生的。如果您需要使用System.out and err然后你可以使用上面的 Java 代码重定向它们。

然而,通常使用日志记录代码来代替。常见的日志包有log4j http://logging.apache.org/log4j/1.2/ or logback http://logback.qos.ch/它将单个多行日志消息自动写入输出文件,这样它们就不会交错。正如@fge提到的,还有java.util.logging内置于 JVM 中 http://docs.oracle.com/javase/6/docs/technotes/guides/logging/overview.html尽管其他软件包提供了更多功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

导致运行时异常在控制台输出中使用 println 正确排序 的相关文章

随机推荐

  • Gradle - 将目录添加到类路径

    我的应用程序要求 config当它在目录下查找配置文件时 目录在类路径上可用 我目前的依赖项配置如下 尽管这可能不是使目录可供我的应用程序使用的正确方法 dependencies runtime compile dependencies p
  • JavaScript 中的布尔对象和布尔数据类型有什么区别?

    布尔类型有两个字面量 值 true 和 false 不要混淆原始布尔值 值 true 和 false 与 true 和布尔值的假值 目的 布尔对象是 原始布尔值的包装 数据类型 有关更多信息 请参阅布尔对象 信息 这是什么意思 布尔对象和布
  • mongodb:获取特定文档然后获取其余文档的最佳方式

    假设我有 1000 个文档 每个文档都有 user id text 现在 我想提取所有这些文档 但首先从一些特定用户 给定用户 ID 数组 中提取文档 然后再提取所有其余文档 我正在考虑如果 user id 存在于特定用户数组中 使用作用域
  • 未找到具有有效签名身份(即证书和私钥对)的配置文件

    是的 我知道这个问题有很多重复 但我尝试了其他人建议的所有内容 此时我没有重复项 我从头开始撤销并重新生成了证书和密钥 我将我的证书与相应的密钥配对 我面临的问题如下 如果我尝试在构建设置中使用发行配置文件进行发布 我会不断收到标头中指定的
  • 如何将 xml 字符串读入 XMLTextReader 类型

    我有一个 XML 字符串 我需要将此字符串转换为XML文本阅读器 System Xml XMLTextReader 输入 dotnet 我使用了以下代码 string szInputXml
  • 如何编辑 JavaScript 警报框标题?

    我正在 C NET 页面中使用以下代码生成 JavaScript 警报 Response Write 它显示一个标题为 来自网页的消息 的警告框 标题可以修改吗 不 你不能 这是一项安全 反网络钓鱼功能
  • Solr:如何搜索多个字段

    我正在使用 solrnet 我有标题和描述字段 我需要同时搜索这两个字段 我该怎么做呢 Jayendra 的答案是正确的 但如果您想在索引时 copyFields 不聚合单个字段中的数据并希望在查询时执行此操作 而不是使用标准处理程序而不是
  • 选项卡行为 Resharper Intellisense 选项

    像 Resharper 这样的产品有很多设置 但我似乎无法找到正确的设置来获得我想要的确切行为 我试图改变的行为是这样的 假设我想要的最终结果是 但目前的线路是 正如你所期望的 我开始输入 一个选项卡后我得到这个 但我希望它成为 有谁知道如
  • 批处理 - 将变量与正则表达式进行比较

    我正在编写一个批处理脚本 必须检查计算机上是否安装了某些程序 为此 我执行programName version我将输出存储在变量中 问题是当我尝试与正则表达式进行比较时 只是为了知道该程序是否存在于机器中 我正在尝试这段代码 但不起作用
  • 使用 Python 在大型文本文件中查找和替换特定行的最快方法

    我有一个numbers txt文件由多个 100K 行组成 每行由两个唯一的数字组成 并用 sign 407597693 1604722326 2426915 510905857 1604722326 2696202 76792361 16
  • 你真的需要“finally”块吗

    java 中的 try catch finally 块有 3 种排列 试着抓 尝试 抓住 终于 尝试 终于 一旦执行了finally 块 控制就会转到finally 块之后的下一行 如果我删除finally块并将其所有语句移至try cat
  • 输入一系列音符并播放它们

    我和我的儿子正在尝试编写一个程序 允许用户输入一系列音符 并将它们保存到要播放的列表中 我们提出了以下方案 import math import needed modules import pyaudio sudo apt get inst
  • node-webkit 相当于 sinatra 吗?

    我一直在考虑学习如何基于 Web 技术制作简单的 Mac OS X 应用程序 并且我遇到了似乎很有吸引力的 node webkit 然而 我最近投入了学习 Sinatra Ruby 的基础知识 并且我想继续学习该课程 对于使用 Sinatr
  • Objective C 协议相当于 Java 接口吗?

    问题不仅仅是关于标题 更多的是 我将如何实现这一目标 而不试图将 Java Flash 设计强制到 Objective C iPhone 程序中 我有 6 个扩展 UIView 的视图 这些视图都有不同的行为 但共享某些方法 例如 void
  • 在相机视图上显示自定义按钮

    有谁知道是否有一种方法可以在相机视图上粘贴自定义按钮 以允许用户像 oink 或 instagram 一样从其库中选择照片 而无需创建自定义视图 谢谢 Edit 使用覆盖层添加按钮似乎很容易 有谁知道如何实际显示照片库并使用该人选择的内容
  • KendoMobile ui 模板不渲染 css 如何使模板在视图中使用 kendo stylng 进行渲染?

    基本上模板不会使用以下方式渲染到 ScrollViewkendo render template response 但会与content template response 但这没有视图中的样式 请参阅下面的评论 如何使模板在视图中呈现剑道
  • Animate.spring 完成后调用函数

    我正在使用动画以便弹出窗口从右侧进入 我为此使用以下代码 var toValue 200 if this state fileMenu toValue 0 Animated spring this state bounceValue toV
  • Cgo 找不到像 这样的标准库

    我试图在我的 Go 代码中包含 C 代码 但未被识别 我首先认为它认为它是 C 代码并尝试 并失败 编译 但删除包含行实际上给了我这样的 C 错误故障排除error cout is not a member of std 该代码可以使用 g
  • 为什么从 .dll 导入函数时需要 .lib 文件?

    你能帮我理解 为什么从 dll 导入函数和数据时需要 lib 文件吗 我听说它包含来自相应 dll 的导出函数和数据元素的列表 但是当我使用 CFF Explorer 探索我的 dll 时 我发现 dll 已经具有导出函数的地址 因此理论上
  • 导致运行时异常在控制台输出中使用 println 正确排序

    VM Java 控制台输出的一个常见问题是 System out 和 System err 通常未正确同步 可能是因为它们位于不同的线程上 这会导致混合输出 如下所示 调试输出与运行时异常堆栈跟踪混合在一起 8 1 3 5 9 13 15