2015-05-05 24 views
13

Bu kodu çalıştırdığınızdaYöntem referans NoClassDefFoundError neden olur: Dizi

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)); 

beklendiği gibi çalışır ve ben lambda tarafından yerine eğer,

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

Ancak çıktılı olsun clone()

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

için bir yöntem referansı bir çalışma zamanı özel olsun:

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) 

Bunu hiç anlamıyorum. Metod referansını ve lambda'nın eşdeğer olduğunu düşünürdüm. Ayrıca almak için gerçekten garip bir istisna gibi görünüyor. Birisi açıklayabilir mi?

JDK 1.8.0_25 kullanıyorum.

cevap

11

Bu, JDK-8056051 numaralı hatadır. 8u40'ta sabit olarak listeleniyor.

Hata değerlendirmelerine dayanarak javac, derleme sırasında belirli bir noktada bir Array sınıfı kullanır ve bu hatayı neden olarak gerçek dizi sınıfına yeniden yazmayı unutur.

İlgili konular