Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-8059731 | 9 | Robert Field | P4 | Resolved | Fixed | b35 |
JDK-8085411 | emb-9 | Robert Field | P4 | Resolved | Fixed | team |
JDK-8064058 | 8u45 | Robert Field | P4 | Resolved | Fixed | b01 |
JDK-8070278 | emb-8u47 | Robert Field | P4 | Resolved | Fixed | team |
FULL PRODUCT VERSION :
java version "1.8.0_20"
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)
A DESCRIPTION OF THE PROBLEM :
JLS §15.13 says that `int[]::clone` is a valid method reference expression. However, using it causes a "java.lang.NoClassDefFoundError: Array" error.
THE PROBLEM WAS REPRODUCIBLE WITH -Xint FLAG: Yes
THE PROBLEM WAS REPRODUCIBLE WITH -server FLAG: Yes
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Compile and run the code listed in "Source code for an executable test case".
EXPECTED VERSUS ACTUAL BEHAVIOR :
I expect the `int[]::clone` and `String[]::clone` to behave the same as `a -> a.clone()`. Instead, they throw a `NoClassDefFoundError`.
ERROR MESSAGES/STACK TRACES THAT OCCUR :
java.lang.NoClassDefFoundError: Array
at ArrayCloneTest.lambda$MR$main$clone$8ed4b78b$1(ArrayCloneTest.java:8)
at ArrayCloneTest$$Lambda$3/1555009629.apply(Unknown Source)
at ArrayCloneTest.lambda$printInt$3(ArrayCloneTest.java:31)
at ArrayCloneTest$$Lambda$4/149928006.get(Unknown Source)
at ArrayCloneTest.lambda$printInt$2(ArrayCloneTest.java:27)
at ArrayCloneTest$$Lambda$5/168423058.get(Unknown Source)
at ArrayCloneTest.print(ArrayCloneTest.java:19)
at ArrayCloneTest.printInt(ArrayCloneTest.java:27)
at ArrayCloneTest.printInt(ArrayCloneTest.java:31)
at ArrayCloneTest.main(ArrayCloneTest.java:8)
Caused by: java.lang.ClassNotFoundException: Array
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 10 more
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import java.util.Arrays;
import java.util.function.Function;
import java.util.function.Supplier;
public class ArrayCloneTest {
public static void main(String[] args) {
int[] intArgs = Arrays.stream(args).mapToInt(Integer::parseInt).toArray();
printInt("int[]::clone", int[]::clone, intArgs);
printInt("a -> a.clone()", a -> a.clone(), intArgs);
printInt("intArgs::clone", intArgs::clone);
printString("String[]::clone", String[]::clone, args);
printString("a -> a.clone()", a -> a.clone(), args);
printString("args::clone", args::clone);
}
private static void print(String label, Supplier<?> s) {
try {
System.out.printf("%s => %s%n", label, s.get());
} catch (Throwable t) {
System.err.printf("%s =!> %s%n", label, t);
t.printStackTrace();
}
}
private static void printInt(String label, Supplier<int[]> s) {
print(label, () -> Arrays.toString(s.get()));
}
private static void printInt(String label, Function<int[], int[]> f, int[] a) {
printInt(label, () -> f.apply(a));
}
private static void printString(String label, Supplier<String[]> s) {
print(label, () -> Arrays.toString(s.get()));
}
private static void printString(String label, Function<String[], String[]> f, String[] a) {
printString(label, () -> f.apply(a));
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Instead of using `int[]::clone`, use `a -> a.clone()` instead.
java version "1.8.0_20"
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)
A DESCRIPTION OF THE PROBLEM :
JLS §15.13 says that `int[]::clone` is a valid method reference expression. However, using it causes a "java.lang.NoClassDefFoundError: Array" error.
THE PROBLEM WAS REPRODUCIBLE WITH -Xint FLAG: Yes
THE PROBLEM WAS REPRODUCIBLE WITH -server FLAG: Yes
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Compile and run the code listed in "Source code for an executable test case".
EXPECTED VERSUS ACTUAL BEHAVIOR :
I expect the `int[]::clone` and `String[]::clone` to behave the same as `a -> a.clone()`. Instead, they throw a `NoClassDefFoundError`.
ERROR MESSAGES/STACK TRACES THAT OCCUR :
java.lang.NoClassDefFoundError: Array
at ArrayCloneTest.lambda$MR$main$clone$8ed4b78b$1(ArrayCloneTest.java:8)
at ArrayCloneTest$$Lambda$3/1555009629.apply(Unknown Source)
at ArrayCloneTest.lambda$printInt$3(ArrayCloneTest.java:31)
at ArrayCloneTest$$Lambda$4/149928006.get(Unknown Source)
at ArrayCloneTest.lambda$printInt$2(ArrayCloneTest.java:27)
at ArrayCloneTest$$Lambda$5/168423058.get(Unknown Source)
at ArrayCloneTest.print(ArrayCloneTest.java:19)
at ArrayCloneTest.printInt(ArrayCloneTest.java:27)
at ArrayCloneTest.printInt(ArrayCloneTest.java:31)
at ArrayCloneTest.main(ArrayCloneTest.java:8)
Caused by: java.lang.ClassNotFoundException: Array
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 10 more
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import java.util.Arrays;
import java.util.function.Function;
import java.util.function.Supplier;
public class ArrayCloneTest {
public static void main(String[] args) {
int[] intArgs = Arrays.stream(args).mapToInt(Integer::parseInt).toArray();
printInt("int[]::clone", int[]::clone, intArgs);
printInt("a -> a.clone()", a -> a.clone(), intArgs);
printInt("intArgs::clone", intArgs::clone);
printString("String[]::clone", String[]::clone, args);
printString("a -> a.clone()", a -> a.clone(), args);
printString("args::clone", args::clone);
}
private static void print(String label, Supplier<?> s) {
try {
System.out.printf("%s => %s%n", label, s.get());
} catch (Throwable t) {
System.err.printf("%s =!> %s%n", label, t);
t.printStackTrace();
}
}
private static void printInt(String label, Supplier<int[]> s) {
print(label, () -> Arrays.toString(s.get()));
}
private static void printInt(String label, Function<int[], int[]> f, int[] a) {
printInt(label, () -> f.apply(a));
}
private static void printString(String label, Supplier<String[]> s) {
print(label, () -> Arrays.toString(s.get()));
}
private static void printString(String label, Function<String[], String[]> f, String[] a) {
printString(label, () -> f.apply(a));
}
}
---------- END SOURCE ----------
CUSTOMER SUBMITTED WORKAROUND :
Instead of using `int[]::clone`, use `a -> a.clone()` instead.
- backported by
-
JDK-8059731 int[]::clone causes "java.lang.NoClassDefFoundError: Array"
-
- Resolved
-
-
JDK-8064058 int[]::clone causes "java.lang.NoClassDefFoundError: Array"
-
- Resolved
-
-
JDK-8070278 int[]::clone causes "java.lang.NoClassDefFoundError: Array"
-
- Resolved
-
-
JDK-8085411 int[]::clone causes "java.lang.NoClassDefFoundError: Array"
-
- Resolved
-