繁体   English   中英

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

[英]Constructor must call super() or this() before return in method

我收到此错误:

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

为什么我会收到这个错误,我怎么能摆脱它呢?

为什么我会收到这个错误,我怎么能摆脱它呢?

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

怎么会发生这种情况?

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

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

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

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

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

我认为你遇到了这个问题,因为你的单元测试使用了一个模拟框架,而模拟框架正在使用“字节代码工程”将一些内容注入到被测试的类中。 执行此操作的代码“出错了”,结果是无法编译的字节码。


这显然是通过重建来解决的,但这与此解释并不矛盾。 重建可以清除由模拟框架注入的破坏的检测代码。 下一次,框架可以“正确”。

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

public KeyboardMap() {
}

到KeyboardMap类。 它会工作。

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

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

似乎在我的一个折叠中,我忘了写折叠的开头,像这样:

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

纠正这个解决了我的问题 奇怪,因为这只是一个评论,它适用于NetBeans

在我的例子中,在buildTypes下关闭build.gradle中的minify有帮助。

minifyEnabled false

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM