Java调试和运行会产生不同的结果
所以,我和我的朋友在开发过程中遇到了一个问题,似乎无法解决 一点背景信息:Java调试和运行会产生不同的结果,java,debugging,intellij-idea,jvm,Java,Debugging,Intellij Idea,Jvm,所以,我和我的朋友在开发过程中遇到了一个问题,似乎无法解决 一点背景信息: Connected to the target VM, address: '127.0.0.1:65492', transport: 'socket' Disconnected from the target VM, address: '127.0.0.1:65492', transport: 'socket' Found plan Process finished with exit code 0 我们已经实现了
Connected to the target VM, address: '127.0.0.1:65492', transport: 'socket'
Disconnected from the target VM, address: '127.0.0.1:65492', transport:
'socket'
Found plan
Process finished with exit code 0
我们已经实现了一个最佳优先搜索和一个数据类型节点,使我们能够搜索节点的树。注意,在我们的数据类型中,由于实现中更复杂的部分,我们覆盖了hashCode函数
如果找到目标节点,搜索将停止,并使用每个节点的父节点提取解决方案,以编译遍历路径的列表
这个程序比这更复杂,但我希望现在这个描述足够了:)
问题:
Exception in thread "main" java.lang.NullPointerException
at java.util.HashSet.<init>(HashSet.java:118)
at conflict.ClearPathConflict.solveConflict(ClearPathConflict.java:133)
at searchclient.Plan.getExpandedResolutions(Plan.java:233)
at searchclient.Plan.solve(Plan.java:94)
at search.SearchHTN.getExpandedNodes(SearchHTN.java:33)
at search.SearchHTN.search(SearchHTN.java:59)
at searchclient.SearchClient.run(SearchClient.java:127)
at Debug.main(Debug.java:12)
Process finished with exit code 1
对于这个搜索问题,我们有不同的输入(相同的标准),每当一个搜索问题无法解决时,我们就调试我们的算法,找出它的行为方式和原因
然而,一个特定的输入给出了一个奇怪的响应。正常的构建和运行不起作用,并在搜索时抛出异常,向我们指出有问题,但当我们尝试调试它时,搜索完成,并根据我们所能收集的信息为我们提供正确的解决方案
随着调试模式的完成和工作,我们很难像您想象的那样真正调试它:)
- 从这个行为我们推测我们的代码在调试VM中的工作方式不同
- 正常运行和调试运行之间有什么区别
- 两者的执行情况如何不同
Exception in thread "main" java.lang.NullPointerException
at java.util.HashSet.<init>(HashSet.java:118)
at conflict.ClearPathConflict.solveConflict(ClearPathConflict.java:133)
at searchclient.Plan.getExpandedResolutions(Plan.java:233)
at searchclient.Plan.solve(Plan.java:94)
at search.SearchHTN.getExpandedNodes(SearchHTN.java:33)
at search.SearchHTN.search(SearchHTN.java:59)
at searchclient.SearchClient.run(SearchClient.java:127)
at Debug.main(Debug.java:12)
Process finished with exit code 1
Found plan
输出意味着我们已经找到了问题的解决方案,并且已经制定了详细说明解决方案的计划。我们已经在调试模式下检查了这一点,就我们所见,找到的计划是一个有效的解决方案
我们尝试了什么?
- 我们已经在不同的机器上测试了代码
- 不同的操作系统
- 在IntelliJ和命令行Java中运行它李>
- 从我们的回购协议中提取新版本并重新编译
Exception in thread "main" java.lang.NullPointerException
at java.util.HashSet.<init>(HashSet.java:118)
at conflict.ClearPathConflict.solveConflict(ClearPathConflict.java:133)
at searchclient.Plan.getExpandedResolutions(Plan.java:233)
at searchclient.Plan.solve(Plan.java:94)
at search.SearchHTN.getExpandedNodes(SearchHTN.java:33)
at search.SearchHTN.search(SearchHTN.java:59)
at searchclient.SearchClient.run(SearchClient.java:127)
at Debug.main(Debug.java:12)
Process finished with exit code 1
正常编译和运行java程序会产生与在调试模式下运行时不同的结果。由于调试模式会产生正确的结果,因此我们无法在正常模式下找到出错的地方。欢迎使用堆栈溢出!请拿着这本书,四处看看,仔细阅读,尤其是和请输入完整的错误消息。还有一个有趣的问题,你能更明确地解释一下例外情况吗?啊,是的,当然-对此感到抱歉。这个问题把我难住了:D!我已编辑并添加了问题错误消息:)如果记录应用程序的每次运行(调试和非调试)并相互比较日志,会发生什么情况?异常表示传递给
HashSet
的构造函数的集合已为null
。您可以使用堆栈跟踪来追溯null
参数的来源以及在什么情况下可能是null
。不同的结果可能是由于时间差异(通常表示与多线程相关的错误)或由于JRE会话的历史记录,这可能表明一些代码依赖于未指定的东西,例如HashMap
/HashSet
迭代顺序。