几个月前,我创建了一个计算国际象棋评分的 Java 应用程序。我只在我的电脑上测试过它,但程序按预期工作。
我只是发现在某些操作系统上,该程序无法正常工作。我在Windows 7上包含了不正确输出的图片,而这是我在Windows 8上得到的。(球员的评分应该会降低,因为他在面对评分较低的对手时只得分 1.5/5)。似乎该程序不允许玩家的评分降低。
谁能指出我正确的方向,为什么程序在这两个版本的 Windows 之间表现不同?我无法在 SO 或其他任何地方找到任何解释。
我认为最合理的解释是 Windows 7 版本在字段 2 中有不同的参数:2068 而 Windows 8 有 2048。
首先,这里有几件事不会成为原因。
算术在 Windows 7 和 8 上的 Java 之间没有不同。如果您使用相同的输入运行相同的(单线程)算法,那么输出应该是相同的。
算术在 32 位和 64 位 JVM 上没有变化。
那会是什么?假设它是同一个 JAR,那么算法很可能不会改变。所以这里有几种可能性。
这可能是不同输入的结果。如果不查看算法,我们不能排除它可能以意想不到的方式对输入敏感。
如果您的代码中存在竞争条件,您可能会发现程序的某些方面在某些 Java 平台上无法正常工作……由于 CPU 速度、内存架构和/或线程调度的差异。
这是您可能得到的最精确的答案……无需查看您的代码。所以我认为你将不得不自己调试这个。
访问一些出现问题的 Windows 7 机器。
运行带有调试器的应用程序,以查看问题是否在这些条件下再次出现。如果是这样,则以正常方式进行调试以找出算法不起作用的原因。
如果附加调试器(并设置断点)改变了程序的行为方式(即它使问题“消失”),那么你就有证据表明某种竞争条件。
对于未来的 Google 员工来说,问题不在于 Java,而是在于 Java。这是我的程序从中读取数据的文本文件中的换行符的问题。出于某种原因,我的文本文件中的“\n”字符分隔值没有出现在 Windows 7 中,但在 Windows 8 中运行良好。很奇怪,但很高兴它已修复!