3

我收到此错误:

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

为什么我会收到该错误,我该如何摆脱它?

4

4 回答 4

9

为什么我会收到该错误,我该如何摆脱它?

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

怎么会这样?

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

  • 如果这是 Java 代码,那么:

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

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

  • 如果是其他语言,那么第一个嫌疑人将是“其他语言到字节码”的编译过程。

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


这显然是通过重建修复的,但这与这个解释并不矛盾。重建可以清除由模拟框架注入的损坏的检测代码。下一次,框架可以“做对了”。

于 2013-08-14T01:14:02.490 回答
0

只需通过添加覆盖默认构造函数

public KeyboardMap() {
}

到 KeyboardMap 类。它会起作用的。

于 2014-10-22T08:35:50.420 回答
0

我遇到了同样的问题,这是由一件非常奇怪的事情引起的:在 NetBeans 中,我使用编辑器折叠来折叠长代码:

// <editor-fold desc="SOME DESCRIPTION">
  ...
  ...
// </editor-fold>

似乎在我的其中一个折叠中我忘记写折叠的开头,如下所示:

  ...
  ...
// </editor-fold>

纠正这个解决了我的问题。奇怪,因为这只是一条评论,而且是针对 NetBeans 的

于 2015-06-08T14:29:31.340 回答
0

就我而言,在 buildTypes 下的 build.gradle 中关闭 minify 会有所帮助。

minifyEnabled false
于 2019-07-31T21:17:43.457 回答