java版本之间的不兼容性

Ant*_*ton 5 java incompatibility java-7 java-8

有一段复杂的代码可以执行许多复杂的数学运算.

当它由maven在jdk 1.7上构建和测试时,它会通过所有测试.使用jdk 1.8时失败.

试图在调试器中找到计算出错的地方似乎几乎没有希望.

我有什么选择?有没有一种工具可以在我的代码中扫描jdk 1.7和1.8之间的不兼容性?

我是最好的选择,在两个单独的调试器中运行代码,看看差异在哪里?

编辑:

@PhilippClaßen到目前为止,这是最可能的原因.我希望有一种自动检查方法.

@dkatzel这段代码不是我写的,评论很差,并且做了对我来说是"木头"的科学计算.

@Mike Samuel我认为这种方法没有比并行运行两个调试器更好的了.

谢谢大家的帮助.似乎两个调试器是最好的方法.

编辑2 原始代码的作者依赖于哈希映射排序.那就是问题所在.

Phi*_*ßen 7

留意不确定性的来源.

特别是依赖于像HashMaps这样的集合中元素排序的代码是危险的,因为排序是未指定的并且取决于JVM.

我在每次JVM升级中都看到过这样的(错误的)代码运气很好,并且一旦JVM实现发生变化就会立即崩溃.


Mik*_*uel 3

添加日志记录语句来记录每个中间结果。你可以使用类似的东西

static void dumpDoubleWithLineNumber(double d) {
  StackTraceElement[] stack = Thread.currentThread().getStackTrace();
  // Thread.getStackTrace() and this method are elements 0 and 1
  StackTraceElement caller = stack[2];
  System.err.println(
      caller.toString()
      + " : " + d 
      + " / " + Long.toString(Double.toLongBits(d), 16));
}
Run Code Online (Sandbox Code Playgroud)

然后在 Java 7 下运行一次,在 Java 8 下运行一次,并对结果进行比较。