java.lang.VerifyError :(类:ea / Individual,方法:<init>签名:(I)V)构造函数必须调用super()或this()</init>

时间:2011-12-20 17:02:03

标签: java netbeans

我没有在这个课程中发现任何错误,但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()

在另一个使用Individual类的类中:

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

这是个人类正在被实例化的地方:

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

修改

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

EDIT2

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

5 个答案:

答案 0 :(得分:5)

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

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

(是的,您在this的大多数地方都换了indcopy。)

答案 1 :(得分:4)

这可能不是问题所在,但是你的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();

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

java.lang.VerifyError可以是针对不同的库编译而不是在运行时使用的结果。

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

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

相关问题