如何在不更改代码的情况下从已编译的 jar 中检索完整的异常消息?

Posted

技术标签:

【中文标题】如何在不更改代码的情况下从已编译的 jar 中检索完整的异常消息?【英文标题】:How to retrieve full exception message from compiled jar without changing the code? 【发布时间】:2016-02-08 12:08:45 【问题描述】:

Java 应用程序异常终止:

liquibase.exception.LiquibaseException: liquibase.command.CommandExecutionException: liquibase.exception.DatabaseException: java.lang.NumberFormatException
        at liquibase.integration.commandline.CommandLineUtils.doDiffToChangeLog(CommandLineUtils.java:211)
        at liquibase.integration.commandline.Main.doMigration(Main.java:967)
        at liquibase.integration.commandline.Main.run(Main.java:180)
        at liquibase.integration.commandline.Main.main(Main.java:99)
Caused by: liquibase.command.CommandExecutionException: liquibase.exception.DatabaseException: java.lang.NumberFormatException
        at liquibase.command.AbstractCommand.execute(AbstractCommand.java:13)
        at liquibase.integration.commandline.CommandLineUtils.doDiffToChangeLog(CommandLineUtils.java:209)
        ... 3 more
Caused by: liquibase.exception.DatabaseException: java.lang.NumberFormatException
        at liquibase.snapshot.jvm.ColumnSnapshotGenerator.addTo(ColumnSnapshotGenerator.java:120)
        at liquibase.snapshot.jvm.JdbcSnapshotGenerator.snapshot(JdbcSnapshotGenerator.java:73)
        at liquibase.snapshot.SnapshotGeneratorChain.snapshot(SnapshotGeneratorChain.java:50)
        at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:194)
        at liquibase.snapshot.DatabaseSnapshot.replaceObject(DatabaseSnapshot.java:292)
        at liquibase.snapshot.DatabaseSnapshot.replaceObject(DatabaseSnapshot.java:314)
        at liquibase.snapshot.DatabaseSnapshot.includeNestedObjects(DatabaseSnapshot.java:234)
        at liquibase.snapshot.DatabaseSnapshot.include(DatabaseSnapshot.java:208)
        at liquibase.snapshot.DatabaseSnapshot.init(DatabaseSnapshot.java:70)
        at liquibase.snapshot.DatabaseSnapshot.<init>(DatabaseSnapshot.java:44)
        at liquibase.snapshot.JdbcDatabaseSnapshot.<init>(JdbcDatabaseSnapshot.java:21)
        at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:150)
        at liquibase.snapshot.SnapshotGeneratorFactory.createSnapshot(SnapshotGeneratorFactory.java:139)
        at liquibase.command.DiffCommand.createReferenceSnapshot(DiffCommand.java:190)
        at liquibase.command.DiffCommand.createDiffResult(DiffCommand.java:140)
        at liquibase.command.DiffToChangeLogCommand.run(DiffToChangeLogCommand.java:51)
        at liquibase.command.AbstractCommand.execute(AbstractCommand.java:8)
        ... 4 more
Caused by: java.lang.NumberFormatException
        at java.math.BigDecimal.<init>(Unknown Source)
        at java.math.BigDecimal.<init>(Unknown Source)
        at java.math.BigDecimal.<init>(Unknown Source)
        at liquibase.util.SqlUtil.parseValue(SqlUtil.java:208)
        at liquibase.snapshot.jvm.ColumnSnapshotGenerator.readDefaultValue(ColumnSnapshotGenerator.java:387)
        at liquibase.snapshot.jvm.ColumnSnapshotGenerator.readColumn(ColumnSnapshotGenerator.java:223)
        at liquibase.snapshot.jvm.ColumnSnapshotGenerator.addTo(ColumnSnapshotGenerator.java:115)
        ... 20 more

我现在 NumberFormatException 应该包含“For input string”文本。如何查看该异常的消息文本?

不是来自代码,这是一个已编译的 jar 应用程序,它使用 bat 文件运行,如下所示:

java -cp "%CP%" %JAVA_OPTS% liquibase.integration.commandline.Main %CMD_LINE_ARGS%

【问题讨论】:

您使用什么 java 运行时来运行您的应用程序? 相关问题(自己控制代码怎么办):***.com/questions/1791610/… @SpaceTrucker Java(TM) SE 运行时环境(内部版本 1.8.0_66-b18) 我现在 NumberFormatException 应该包含“For input string”文本。 - 是什么让你这么认为? @Vlad,jira 票证中的堆栈跟踪的根本原因是 Integer 而不是 BigDecimal,就像您的情况一样。如果您查看 BigDecimal 代码,您会看到大多数情况下,非参数构造函数用于 NumberFormatException,并且在任何情况下,输入永远不会是消息的一部分(真正的构造函数使用字节数组作为输入,而不是很高兴简单地添加错误消息)。 【参考方案1】:
Caused by: java.lang.NumberFormatException

...

我现在 NumberFormatException 应该包含“For input string”文本。如何查看该异常的消息文本?

可能没有消息供您查看。如果 NumberFormatException 有详细消息,它将是堆栈跟踪的一部分。 Here is the javadoc for NumberFormatException。您会注意到,不能保证异常会有详细的消息。事实上,它有a no-argument constructor,它被记录为构造“没有详细消息的 NumberFormatException”。

此外,here is the main constructor 用于 BigDecimal 类的 OpenJDK 实现。如果您仔细查看它,您会发现它在一些地方抛出了 NumberFormatExceptions 而没有详细信息。

【讨论】:

以上是关于如何在不更改代码的情况下从已编译的 jar 中检索完整的异常消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不打开的情况下从 CSV 文件中检索数据

如何在不监听事件的情况下从 firebase 数据库中检索数据 [重复]

如何在不推动我的情况下从GitHub中提取更改?

SwiftUI 如何在不使用 List 的情况下从 @ObservedObject ViewModel 获取 Firebase 数据

在不使用表格的情况下从 BigQuery 中的 csv 文件中检索数据

如何在不更改顺序的情况下从 plist 加载数据