带有内部类和 lambda 的 java.lang.VerifyError

标签 java lambda jvm-crash

以下代码编译但导致 java.lang.VerifyError。即使未执行 run() 方法也会发生此错误。

import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;


public class TestCase {

    public static void main(String[] args) {
        new TestCase().run();
    }

    public void run() {
        class Inner {

        }
        Map<String, Inner> map = new HashMap<>();
        Function<String, Inner> function = (name) -> {
            Inner i = map.get(name);
            if (i == null) {
                i = new Inner();
                map.put(name, i);
            }
            return i;

        };
        function.apply("test");
    }
}

错误:

Exception in thread "main" java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    TestCase.lambda$0(Ljava/util/Map;Ljava/lang/String;)LTestCase$1Inner; @20: invokespecial
  Reason:
    Type 'java/util/Map' (current frame, stack[2]) is not assignable to 'TestCase'
  Current Frame:
    bci: @20
    flags: { }
    locals: { 'java/util/Map', 'java/lang/String', 'TestCase$1Inner' }
    stack: { uninitialized 15, uninitialized 15, 'java/util/Map' }
  Bytecode:
    0000000: 2a2b b900 2d02 00c0 0032 4d2c c700 15bb
    0000010: 0032 592a b700 344d 2a2b 2cb9 0037 0300
    0000020: 572c b0                                
  Stackmap Table:
    append_frame(@33,Object[#50])

    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2688)
    at java.lang.Class.getMethod0(Class.java:2937)
    at java.lang.Class.getMethod(Class.java:1771)
    at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)

但是,如果我将“内部”类移动为 TestCase 的内部类(而不是在方法中声明),错误就会消失。或者,如果我使用匿名类来定义函数,错误就会消失。这似乎是方法中声明的类和使用 lamba 的问题。

这是 JVM 错误吗?或者我错过了什么?我正在使用 Oracle 的 Java 8。错误发生在命令行和 Eclipse 4.4 中。

编辑: 我升级到最新的 JDK: Java 版本“1.8.0_11” Java(TM) SE 运行时环境(build 1.8.0_11-b12) Java HotSpot(TM) 64 位服务器 VM(构建 25.11-b03,混合模式)

当通过 javac 手动编译并运行时,它工作正常。如果我运行 Eclipse 编译的类,它不会。所以现在我怀疑 Eclipse 编译器有错误。

最佳答案

当您的编译器生成 validator 无法验证的代码时,会抛出验证错误。 当“validator ”检测到类文件虽然格式正确,但包含某种内部不一致或安全问题时。因此,正如您所建议的,这显然是您的 eclipse 编译器的问题。它无法正确编译这些结构。

关于带有内部类和 lambda 的 java.lang.VerifyError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25332861/

相关文章:

Eclipse 不启动 : JVM terminated. 退出代码=14

Java IDE - 查找函数或类的所有间接用法/引用?

java - 直接调用子类对象时的静态和私有(private)方法行为听起来像重写?

c# - lambda 外部子查询迭代变量评估的次数

java - LG G4在基于Lunar Lander的Android游戏启动时崩溃

java - Jpcap 破坏 JVM

java - JPA 不返回 MySQL varbinary 字段的 UUID "Text"值

java - java.lang.Class 中的 cachedConstructor 字段的用途是什么?

python - 不理解这个带有 defaultdict 的 lambda 表达式

Java lambda 比匿名类慢 20 倍