java - Lambda 表达式 java 8 异常 : java. lang.NoSuchMethodError : java. lang.invoke.LambdaMetafactory.metaFactory

标签 java eclipse lambda expression java-8

我在运行以下代码时遇到问题:

    public class LambdaTesting {
        public static void main(String[] args){
             new LambdaTesting();    
        }
        public LambdaTesting(){
            test1();
        }
        private void test1(){
            Runnable x = () -> System.out.println("ok"); //error
        }
    }

这导致了以下异常:

*Exception in thread "main" java.lang.IncompatibleClassChangeError 
at java.lang.invoke.MethodHandleNatives.linkMethodHandleConstant(MethodHandleNatives.java:383)
    at LambdaTesting.test1(LambdaTesting.java:24)
    at LambdaTesting.<init>(LambdaTesting.java:20)
    at LambdaTesting.main(LambdaTesting.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:765)
    at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:882)
    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:381)
    ... 3 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:854)
    at java.lang.invoke.MemberName$Factory.resolveOrFail(MemberName.java:879)
    ... 6 more*

我已经安装了从以下位置下载的jdk8: http://jdk8.java.net/lambda/ (Windows x64版本)

我在 Eclipse 中运行它版本:4.4.0,下载自: http://downloads.efxclipse.org/eclipse-java8/2013-06-30/ (文件:org.eclipse.sdk.ide-win32.win32.x86_64.zip 2013年6月30日17:35 180M)

eclipse.ini 文件:

-vm
C:\Program Files\Java\jre8\bin\java.exe
-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.200.v20130521-0416
-showsplash
org.eclipse.platform
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Xms40m
-Xmx512m

项目属性 -> Java 编译器 -> 编译器合规级别:1.8(BETA) (使用默认合规性设置已选中)。

项目属性 -> Java 构建路径 -> 库: JRE系统库[jre8]

项目运行配置:

[JRE 选项卡] 项目 JRE (jre8) 已选中

[类路径选项卡] Boostrap 条目:JRE 系统库 [jre8]

我还尝试从 jre8/bin 目录中的命令行运行 LambdaTesting.class 但出现了同样的异常。

Java版本:

C:\Program Files\Java\jre8\bin>java.exe -version
java version "1.8.0-ea"
Java(TM) SE Runtime Environment (build 1.8.0-ea-b102)

我的操作系统是:Windows 7 x64

有什么线索吗?

感谢@assylias,我解决了使用jdk1.8.0/bin/javac.exe从命令行编译的问题,但在Eclipse中仍然没有结果。看来 Eclipse 的编译器错误。 我尝试更改设置:首选项 -> Java -> 编译器,但我只能在“生成的 .class 文件兼容性”中选择版本 1.7(此设置中没有可用的 1.8)。 “使用默认合规性设置”导致上述异常。

最佳答案

我发现您的示例对于最新的测试版编译得很好。不确定您要评估什么,但我做了类似的测试,如下所示:

public class LambdaTesting {
    public static String[] strs = { "a", "aa", "aaa"};

    public static void main(String args[]) throws Exception {
        ExecutorService pool = Executors.newFixedThreadPool(3);
        Set<Future<Integer>> set = new HashSet<Future<Integer>>();
        for (String word : strs) {

            Callable<Integer> c = (() -> word.length());

            Future<Integer> future = pool.submit(c);
            set.add(future);
        }
        int sum = 0;
        for (Future<Integer> future : set) {
            sum += future.get();
        }
        System.out.printf("The sum of lengths is %s%n", sum);
        System.exit(sum);
    }
}

我使用了在这里找到的示例执行器:java Runnable run() method returning a value作为我的基本程序,并用 lambda 表达式替换了字数统计。这一切都与最新的 Java 8 beta 和 2013 年 9 月构建的 eclipse Kepler 配合得很好,如下所示:http://downloads.efxclipse.org/eclipse-java8/ - 旅行

关于java - Lambda 表达式 java 8 异常 : java. lang.NoSuchMethodError : java. lang.invoke.LambdaMetafactory.metaFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18197437/

相关文章:

Java:+=等价

java - 垃圾收集和 JNI 调用

java - 如何用java将套接字绑定(bind)到IP?

java - Eclipse 似乎同时运行我的 Java JDA Discord 机器人的新版本和旧版本?为什么以及如何发生这种情况?

java - 使用外部 Jar 文件中的 Main 方法从项目构建可运行的 Jar

python - 帮我 lambda-nize 这个

java - 如何使用另一个类中的 int?

Java集合求最大数

c# - Lambda 分配局部变量

lambda - 使用 lambda 简化 Kotlin 函数