所以,我和我的朋友在开发过程中遇到了一个问题,似乎无法弄明白。
一些背景信息:
我们已经实施了最佳优先搜索以及数据类型 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
输出表示我们已找到问题的解决方案,并且已制定详细说明解决方案的计划。我们已经在调试模式下检查了这一点,据我们所知,找到的计划是一个有效的解决方案。
我们尝试了什么?
每次都有相同的结果,如果我们正常编译并运行它,搜索就会失败,但是当我们调试它时,它实际上就完成了,并为问题提供了正确的解决方案。
我们还注意到,搜索似乎在失败之前会持续很长一段时间,而不是完成。也就是说,它在失败的运行中探索了比在调试运行中更多的节点。
我们在这里不知所措,所以我们希望你们可以通过询问,猜测或其他方式来帮助我们:)
提前致谢!
TL; DR :
正常编译和运行java程序会产生与在调试模式下运行它时不同的结果。由于调试模式产生了正确的结果,我们无法找到正常模式下出现的问题。