我收到这个错误:
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/