java.lang.NoSuchMethodError: java.lang.Double when running openjdk

java.lang.NoSuchMethodError: java.lang.Double when running openjdk

我在 java 中编写了一个命令行应用程序。它在 Eclipse 中完美运行,导出到 jar 在 windows 上的最新 java 中运行,但在 ubuntu 服务器 12.04 openjdk-7-jre-headless.

上的某个时刻崩溃
java version "1.7.0_91"
OpenJDK Runtime Environment (IcedTea 2.6.3) (7u91-2.6.3-0ubuntu0.12.04.1)
OpenJDK Client VM (build 24.91-b01, mixed mode, sharing)

Double.min 函数似乎有问题:

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.NoSuchMethodError: java.lang.Double.min(DD)D
    at Test.main(Test.java:149)
    ... 5 more

这里是有问题的代码:

String balance = "25000.00"
double MAX = 20000;
String amount = Double.toString(Double.min(MAX, Double.parseDouble(balance)));

我尝试将其编译为 java 1.5、1.6、1.7、1.8 的不同版本,但错误仍然存​​在。

解决方案

String amount = Double.toString(Math.min(MAX, Double.parseDouble(balance)));

根据所有出色的答案,Double.min 在 java 8 之前不可用。但是 Math.min 函数与 java 6 完全相同。

Double#min(double, double) 是在 Java 8 中引入的,您使用它编译代码。当您尝试 运行 it 和较旧的 JDK 时,找不到此方法(因为尚未引入),并且您会收到您提到的错误。

您应该确保您使用的是 Java 8 的 JDK 或更改您的代码以不依赖此方法。例如,通过创建您自己的 min 方法:

public static double min (double a, double b) {
    return a < b ? a : b;
}

根据 javadocsDouble 中的 min 方法仅在 JDK 8.

中添加

您应该确保您的代码符合 运行 JDK8。此外,如果您想在 v8 以下使用 JDK,请考虑使用 Math 的 min 方法。