如何在不更改代码的情况下从已编译的 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 中检索完整的异常消息?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不监听事件的情况下从 firebase 数据库中检索数据 [重复]
SwiftUI 如何在不使用 List 的情况下从 @ObservedObject ViewModel 获取 Firebase 数据