Method reference to array clone() causes NoClassDefFoundError: Array
Method reference to array clone() causes NoClassDefFoundError: Array
当我运行这段代码
List<int[]> list = Arrays.asList(new int[]{1, 2, 3}, new int[]{4, 5});
int[][] arr = list.stream().map(j -> j.clone()).toArray(int[][]::new);
System.out.println(Arrays.deepToString(arr));
它按预期工作,我得到了输出
[[1, 2, 3], [4, 5]]
但是,如果我用 clone()
的方法参考替换 lambda
int[][] arr = list.stream().map(int[]::clone).toArray(int[][]::new);
我得到一个运行时间异常:
Exception in thread "main" java.lang.NoClassDefFoundError: Array
at Main.lambda$MR$main$cloneed4b78b(Main.java:14)
at Main$$Lambda/1160460865.apply(Unknown Source)
at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:193)
at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:576)
at java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:255)
at java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:438)
at Main.main(Main.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.lang.ClassNotFoundException: Array
at java.net.URLClassLoader.run(URLClassLoader.java:372)
at java.net.URLClassLoader.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)
我完全不明白这个。我原以为方法引用和 lambda 是等价的。这似乎也是一个非常奇怪的例外。谁能解释一下?
我正在使用 JDK 1.8.0_25.
这是错误 JDK-8056051。它在 8u40 中列为已修复。
根据错误评论,javac 在编译期间的某个时刻使用了虚拟 Array
class 并且忘记将其重写为实际数组 class,从而导致此错误。
当我运行这段代码
List<int[]> list = Arrays.asList(new int[]{1, 2, 3}, new int[]{4, 5});
int[][] arr = list.stream().map(j -> j.clone()).toArray(int[][]::new);
System.out.println(Arrays.deepToString(arr));
它按预期工作,我得到了输出
[[1, 2, 3], [4, 5]]
但是,如果我用 clone()
int[][] arr = list.stream().map(int[]::clone).toArray(int[][]::new);
我得到一个运行时间异常:
Exception in thread "main" java.lang.NoClassDefFoundError: Array
at Main.lambda$MR$main$cloneed4b78b(Main.java:14)
at Main$$Lambda/1160460865.apply(Unknown Source)
at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:193)
at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:576)
at java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:255)
at java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:438)
at Main.main(Main.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.lang.ClassNotFoundException: Array
at java.net.URLClassLoader.run(URLClassLoader.java:372)
at java.net.URLClassLoader.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)
我完全不明白这个。我原以为方法引用和 lambda 是等价的。这似乎也是一个非常奇怪的例外。谁能解释一下?
我正在使用 JDK 1.8.0_25.
这是错误 JDK-8056051。它在 8u40 中列为已修复。
根据错误评论,javac 在编译期间的某个时刻使用了虚拟 Array
class 并且忘记将其重写为实际数组 class,从而导致此错误。