我收到此错误:
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);
}
}
为什么我会收到这个错误,我怎么能摆脱它?
答案 0 :(得分:9)
为什么我会收到这个错误,我怎么能摆脱它?
最大的线索是这是VerifyError
,而不是编译错误。这意味着JVM找到了一个字节码文件,其中一个构造函数没有正确链接。这些(实际上)是一个格式错误的字节码。
怎么会发生这种情况?
好吧,它不会发生在以正常方式编译的Java类中。编译器将自动向任何未明确链接的构造函数中插入隐式super()
调用。
如果这是Java代码,则:
使用损坏的编译器编译类(不太可能!)或
编译后调整了字节码。
如果是其他语言,那么第一个嫌疑人将是“字节码的其他语言”编译过程。
我认为你遇到了这个问题,因为你的单元测试使用了一个模拟框架,而模拟框架正在使用“字节代码工程”将一些内容注入到被测试的类中。执行此操作的代码“出错了”,结果是无法编译的字节码。
这显然是通过重建来解决的,但这与此解释并不矛盾。重建可以清除由模拟框架注入的破坏的检测代码。下一次,框架可以“正确”。
答案 1 :(得分:0)
通过添加
覆盖默认构造函数public KeyboardMap() {
}
到KeyboardMap类。它会起作用。
答案 2 :(得分:0)
我遇到了同样的问题,这是由一个非常奇怪的事情引起的: 在NetBeans中,我使用编辑器折叠来折叠长代码:
// <editor-fold desc="SOME DESCRIPTION">
...
...
// </editor-fold>
似乎在我的一个折叠中,我忘了写折叠的开头,像这样:
...
...
// </editor-fold>
纠正此解决了我的问题。 很奇怪,因为这只是一个评论,它适用于NetBeans
答案 3 :(得分:0)
就我而言,在buildTypes下关闭build.gradle中的minify会有所帮助。
minifyEnabled false