2013-08-18 42 views
2

在學習Java中的Lambda表達式之後,我試着練習一些簡單的例子。但在我的第一個例子中,只有我收到以下錯誤。Java中的IncompatibleClassChangeError

Exception in thread "main" java.lang.IncompatibleClassChangeError 
at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:384) 
at com.example.lambda.HelloLambda.main(HelloLambda.java:15) 
Caused by: java.lang.NoSuchMethodException: no such method: java.lang.invoke.LambdaMetafactory.metaFactory(Lookup,String,MethodType,MethodHandle,MethodHandle,MethodType)CallSite/invokeStatic 
at java.lang.invoke.MemberName.makeAccessException(MemberName.java:763) 
at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:880) 
at java.lang.invoke.MethodHandles$Lookup.resolveOrFail(MethodHandles.java:1019) 
at java.lang.invoke.MethodHandles$Lookup.linkMethodHandleConstant(MethodHandles.java:1284) 
at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:382) 
... 1 more 
Caused by: java.lang.NoSuchMethodError: java.lang.invoke.LambdaMetafactory.metaFactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; 
at java.lang.invoke.MethodHandleNatives.resolve(Native Method) 
at java.lang.invoke.MemberName$Factory.resolve(MemberName.java:852) 
at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:877) 
... 4 more 

由於向後兼容性問題,該錯誤似乎是一個錯誤。但不知道如何解決這個問題。在StackOverFlow中的許多答案建議重新編譯可以解決這個問題。但我仍然得到這個錯誤。

我的代碼

package com.example.lambda; 

public class HelloLambda { 

static String firstname = "ChanSek"; 
static String lastname = "Nayak"; 

interface HelloService { 
     String hello(); 
} 

public static void main(String[] args) { 

     HelloService helloService = 
      () -> {String hello="Hello " + firstname + " " + lastname; 
          return hello;}; 
    System.out.println(helloService.hello()); 
    } 
} 

代碼編譯的罰款。但運行給出了上述錯誤。

我正在使用JDK1.8.0快照。

ScreenShot 1Screenshot 2

+0

您需要下載[帶有Lambda支持的JDK 8](http://jdk8.java.net/lambda/)。檢查一下,看看是否只下載了JDK。 –

+0

@RohitJain當然,我已經下載了JDK1.8.0。否則它根本不會編譯。 –

+0

這對我來說運行良好。您是否使用JDK附帶的JVM?你還在用什麼版本號?早期版本是buggy – Reimeus

回答

1

是不是可能是因爲這個?

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8019635

lambda表達式都用Java 8已經做的方式已經改變,最近(07/2013),在不向下兼容方式。

如果你已經設法用一個編譯器進行編譯,該編譯器會與PRE beta 103 lambda表達式進行通信,但是運行的是JRE POST 103 lambda表達式,那麼就會出現問題。 (這裏的提示是,metafactory名稱曾經是混合大小寫,但在java 1.8.0 beta 103中似乎是小寫 - 你正在尋找混合大小寫,但沒有找到它。)

相關問題