2015-05-05 20 views
13

Kiedy uruchomić ten kodMetoda klonu array() powoduje 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)); 

to działa zgodnie z oczekiwaniami i wyprowadzał

[[1, 2, 3], [4, 5]] 

Jednakże, jeśli mogę wymienić lambda przez odniesienie metoda clone()

int[][] arr = list.stream().map(int[]::clone).toArray(int[][]::new); 

otrzymuję wyjątek czasu wykonywania:

Exception in thread "main" java.lang.NoClassDefFoundError: Array 
    at Main.lambda$MR$main$clone$8ed4b78b$1(Main.java:14) 
    at Main$$Lambda$1/1160460865.apply(Unknown Source) 
    at java.util.stream.ReferencePipeline$3$1.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$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) 

Nie rozumiem tego w ogóle. Myślałem, że odniesienie do metody i lambda są równoważne. Poza tym wydaje się to naprawdę dziwnym wyjątkiem. Czy ktoś może wyjaśnić?

Używam JDK 1.8.0_25.

Odpowiedz

11

To jest błąd JDK-8056051. Jest wymieniony jako poprawiony w 8u40.

Na podstawie komentarzy o błędach javac w pewnym momencie podczas kompilacji stosuje klasę dummy Array i zapomina o przepisaniu jej na rzeczywistą klasę tablicową, powodując ten błąd.