Java调试和运行会产生不同的结果

时间:2017-05-05 09:48:23

标签: java debugging intellij-idea jvm

所以,我和我的朋友在开发过程中遇到了一个问题,似乎无法弄明白。

一些背景信息

我们已经实施了最佳优先搜索以及数据类型 Node ,使我们能够搜索 Node 的树。请注意,在我们的数据类型中,由于我们的实现中更复杂的部分,我们会覆盖 hashCode 函数。

如果找到目标节点,搜索将停止,并使用每个 Node 的父级提取解决方案以编译遍历路径的列表。

程序比这更复杂,但我希望这个描述足够现在:)

问题

我们对此搜索问题有不同的输入(相同的标准),并且每当搜索问题无法解决时,我们调试我们的算法以找出它的行为方式和原因,就像它一样。

然而,一个特定的输入给出了一个奇怪的反应。正常的构建和运行不起作用并在搜索时抛出异常,向我们指出出现了问题,但是当我们尝试调试它时,搜索完成并从我们的内容中为我们提供正确的解决方案可以聚集。

随着调试模式的完成和工作,我们很难实际调试它,如你所想:)

  • 从这个行为我们推测我们的代码在调试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

HashSet应该是包含树中路径节点的集合,我们认为因为找不到解决方案,所以会抛出NullPointerException

OBS NullPointerException不是我们系统中的重要部分,在运行和调试模式下执行的区别是。

调试运行

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

Found plan输出表示我们已找到问题的解决方案,并且已制定详细说明解决方案的计划。我们已经在调试模式下检查了这一点,据我们所知,找到的计划是一个有效的解决方案。

我们尝试了什么?

  • 我们在不同的机器上测试了代码。
  • 不同的操作系统'。
  • 将它放在IntelliJ和命令行Java中。
  • 从我们的仓库中拉出一个新版本并重新编译。

每次都有相同的结果,如果我们正常编译并运行它,搜索就会失败,但是当我们调试它时,它实际上就完成了,并为问题提供了正确的解决方案。

我们还注意到,搜索似乎在失败之前会持续很长一段时间,而不是完成。也就是说,它在失败的运行中探索了比在调试运行中更多的节点。

我们在这里不知所措,所以我们希望你们可以通过询问,猜测或其他方式来帮助我们:)

提前致谢!

TL; DR

正常编译和运行java程序会产生与在调试模式下运行它时不同的结果。由于调试模式产生了正确的结果,我们无法找到正常模式下出现的问题。

0 个答案:

没有答案