java - 构造函数必须在方法返回之前调用 super() 或 this()

标签 java

我收到这个错误:

Exception in thread "Thread-0" java.lang.VerifyError: Constructor must call super() or this() before return in method JGame.Util.KeyboardMap.<init>()V at offset 0
        at JGame.Room.Room.keyboardEventTests(Room.java:81)
        at JGame.Room.Room.run(Room.java:54)
        at java.lang.Thread.run(Thread.java:722)

当我的应用程序加载时,它会立即调用此方法(KeyboardMap.map 是一个空的 HashMap)。

这是方法(第 54 行调用此方法 this.keyboardEventTests();):

protected void keyboardEventTests(){
    for(Map.Entry ap : KeyboardMap.map.entrySet()){ // Line 81
        Mapping mp = (Mapping)ap.getValue();
        if(mp.doing){
            mp.run();
        }
    }
}

这是 KeyboardMap 类。

package JGame.Util;

import java.util.HashMap;
import java.util.Map;

public class KeyboardMap{

    public static Map<String, Mapping> map = new HashMap<>();

    public static void set(String key, Boolean value, Runnable run){
        Mapping mp = new Mapping();
        mp.doing = value;
        mp.run = run;
        KeyboardMap.map.put(key, mp);
    }

    public static Mapping get(String key){
        return KeyboardMap.map.get(key);
    }
}

为什么会出现该错误,我该如何摆脱它?

最佳答案

Why am I getting that error, and how can I get rid of it?

最大的线索是这是一个VerifyError,而不是编译错误。这意味着 JVM 找到了一个字节码文件,其中一个构造函数没有正确链接。这些(实际上)是格式错误的字节码。

怎么会这样?

  • 好吧,它不可能发生在以正常方式(只是)编译的 Java 类中。编译器会自动将隐式 super() 调用插入到任何未显式链接的构造函数中。

  • 如果这是 Java 代码,则:

    • 该类是使用损坏的编译器编译的(不太可能!),或者

    • 有些东西在编译后调整了字节码。

  • 如果是其他语言,那么首先怀疑的是“其他语言到字节码”的编译过程。

我认为您遇到这个问题是因为您的单元测试正在使用模拟框架,而模拟框架正在使用“字节代码工程”将某些东西注入(inject)到被测类中。这样做的代码“犯了一个错误”,结果是无法编译的字节码。


这显然是通过重建修复的,但这与这个解释并不矛盾。重建可以清除模拟框架注入(inject)的损坏的检测代码。下一次,该框架可以“正确处理”。

关于java - 构造函数必须在方法返回之前调用 super() 或 this(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18221574/

相关文章:

java - Eclipse 在创建新的 android 项目时崩溃

java - 当我的应用程序收到通知时打开屏幕背光

java - 从底部对齐 recyclerview 子级

java.lang.NoSuchMethodException : $Proxy205. 调度(int,my.package.beans.AdapterHeader,my.package.beans.AdapterInfo)

java - 支持 JAR 的 Java 插件框架

java - 使用 Spring Boot 映射 html 资源

java - Docker 中的 JRE 内存不足

java - 替代 Java 中的 c# 泛型修饰符 "out"

java - 获取没有堆栈跟踪的 "ArrayIndexOutOfBoundsException: null"

java - 从 JSP 访问文件时出现 FileNotFoundException,但如果从普通 Java 应用程序访问则有效