【问题标题】:java.lang.VerifyError: (class: ea/Individual, method: <init> signature: (I)V) Constructor must call super() or this()java.lang.VerifyError: (class: ea/Individual, method: <init> signature: (I)V) 构造函数必须调用 super() 或 this()
【发布时间】:2012-01-24 15:09:47
【问题描述】:

我在这个类中没有发现任何错误,但是 Netbeans 在那个类上持续显示红色符号。类是

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ea;

/**
 *
 * @author riyad
 */

import java.util.Random;
import java.util.BitSet;

public class Individual 
{
    BitSet variable;

    double x;
    double fitness;
    double sharedFitness;
    final int SIZE;


    Random generator = new Random();

    public Individual(int SIZE)
    {
        this.variable = new BitSet(SIZE);
        this.fitness = 0;
        this.sharedFitness = 0;
        this.SIZE = SIZE;


        for(int i=0; i<SIZE; i++)
        {
            if(generator.nextBoolean())
            {
                variable.set(i);
            }
            else
            {
                variable.clear(i);
            }
        }

        x = Double.parseDouble(variable.toString());
    }


    public Individual copy()
    {
        Individual ind = new Individual(SIZE);

        this.variable = (BitSet) ind.variable.clone();
        this.fitness = ind.fitness;
        this.sharedFitness = ind.sharedFitness;
        this.x = ind.x;

        return ind;
    }

    public void evaluate()
    {
        fitness = x * Math.sin(Math.sqrt(x));
    }

    public boolean getBit(int i)
    {
        return variable.get(i);
    }

    public BitSet getBitSet()
    {
        return variable;
    }

    public void setBit(int i)
    {
        variable.set(i);
    }

    public void clearBit(int i)
    {
        variable.clear(i);
    }

    public double getFitness()
    {
        return fitness;
    }

    public double sharedFitness()
    {
        return sharedFitness;
    }

    public void setSharedFitness(double fitness)
    {
        this.sharedFitness = fitness;
    }

    public void setFitness(double fitness)
    {
        this.fitness = fitness;
    }
}

代码正在编译,但出现运行时错误。

Exception in thread "main" java.lang.VerifyError: (class: ea/Individual, method: <init> signature: (I)V) Constructor must call super() or this()

在另一个类中,正在使用个人类:

ArrayList<Individual> pop = new ArrayList<Individual>();

个人类被实例化的地方:

Individual temp = new Individual(STRING_SIZE);
pop.add(temp);

编辑

我没有手动重命名文件。所有的编码都是在 Netbeans 中完成的。唯一的问题是当我创建个人实例时。

EDIT2

我已经将项目复制到另一个地方,一切又正常了。可能是 Netbeans 或 JDK 的错误

【问题讨论】:

  • 当前代码似乎是正确的,问题可能出在个人类的使用上。如何创建它的实例?
  • @stacker:有点不懂。我是新手
  • 当我用这个类创建项目时,我在 Eclipse 中没有看到任何错误。
  • 这似乎是 Netbeans 特有的怪癖,当在不同的包中具有相同签名的重复类时:stackoverflow.com/questions/6560988/… 可能您通过文件资源管理器手动重命名旧类,而不是使用 IDE 重构功能。彻底清除您的项目。

标签: java netbeans


【解决方案1】:

您应该javap .class 文件并检查编译器是否在您的构造函数开始附近生成了对 super() 的调用。

JVM 验证器要求任何构造函数(当然,Object 除外)调用(可能通过另一个构造函数间接调用)它是超类的构造函数。通常,如果您不这样做,编译器会自动插入对超类构造函数的调用,但在某些情况下它可能会被混淆为不这样做(尽管提供的代码似乎并不那么复杂)。

(而且,是的,thisindcopy 的大多数地方都互换了。)

【讨论】:

    【解决方案2】:

    这可能不是问题,但是您的 copy() 方法完全搞砸了...实际上它没有复制任何内容,而是重置原始对象,并返回一个新的空对象。如果您希望它创建对象的副本,您应该执行以下操作:

    public Individual copy()
    {
        Individual ind = new Individual(SIZE);
    
        ind.variable = (BitSet) this.variable.clone();
        ind.fitness = this.fitness;
        ind.sharedFitness = this.sharedFitness;
        ind.x = this.x;
    
        return ind;
    }
    

    然后这样称呼它:

    Individual newOne = oldOne.copy();
    

    【讨论】:

    • 很高兴为您提供帮助,但如果这解决了您的问题,那是偶然的:P 检查 Hot Licks 答案以获得更好的解释。
    【解决方案3】:

    我在 Netbeans 中遇到了同样的问题。清理然后再次构建项目为我解决了它。

    【讨论】:

      【解决方案4】:

      您好,我对 NetBeans 有同样的体验。我很生气,但解决方案很简单。 您必须复制创建新项目和与非功能项目相同的类。然后将旧项目中的类中的所有文本复制到新项目中,如果包名不同,请不要忘记更改包名。然后您的工作将运行:)

      【讨论】:

        【解决方案5】:

        java.lang.VerifyError 可能是针对与运行时使用的库不同的库进行编译时的结果。

        例如,当我尝试运行针对 Xerces 1 编译的程序时发生了这种情况,但在类路径中找到了 Xerces 2。所需的类(在 org.apache.* 命名空间中)是在运行时找到的,因此 ClassNotFoundException 不是结果。类和方法发生了变化,因此在运行时找到的方法签名与编译时的不匹配。

        通常,编译器会标记方法签名不匹配的问题。 JVM 将在加载类时再次验证字节码,并在字节码试图做一些不应该被允许的事情时抛出 VerifyError - 例如。调用返回 String 的方法,然后将该返回值存储在包含 List 的字段中。这是我得到的,但我仍然无法纠正它..

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-26
          • 1970-01-01
          • 1970-01-01
          • 2016-11-26
          • 1970-01-01
          相关资源
          最近更新 更多