我在这个类中没有发现任何错误,但是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 class的另一个类中:
ArrayList<Individual> pop = new ArrayList<Individual>();
个体类被实例化的地方:
Individual temp = new Individual(STRING_SIZE);
pop.add(temp);
编辑
我没有手动重命名文件。所有的编码都是在Netbeans中完成的。唯一的问题是当我创建个体的实例。
EDIT2
我已经把项目复制到另一个地方了,一切又正常了。可能是Netbeans或者JDK的bug
您应该对.class文件进行javap
,并检查编译器是否在构造函数开始附近生成了对super()的调用。
JVM验证器要求任何构造函数(当然Object除外)调用(可能通过另一个构造函数间接调用)它的超类的构造函数。通常情况下,如果您不这样做,编译器会自动插入对超类构造函数的调用,但在某些情况下,它可能会被混淆为不这样做(尽管所提供的代码似乎并不那么复杂)。
(是的,您在copy
的大多数地方交换了this
和ind
)
这可能不是问题,但你的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();
我在Netbeans中遇到了同样的问题。
嗨,我在NetBeans上也有同样的经历。我对此很生气,但解决方法很简单。您必须复制创建新项目和与非功能项目相同的类。然后将旧项目中的类中的所有文本复制到新项目中,如果不相同,不要忘记更改包名。然后您的工作将运行:)
java.lang。VerifyError可能在编译时使用的库与运行时使用的库不同时产生。
例如,当我试图运行一个针对Xerces 1编译的程序,但在类路径上发现了Xerces 2时,就发生了这种情况。所需的类(在org.apache。* namespace)在运行时被发现,所以ClassNotFoundException不是结果。对类和方法进行了更改,因此在运行时找到的方法签名与编译时的签名不匹配。
通常,编译器将标记方法签名不匹配的问题。当类被加载时,JVM将再次验证字节码,并在字节码试图做一些不应该被允许的事情时抛出VerifyError——例如,调用返回String的方法,然后将返回值存储在包含List的字段中。这是我得到的,但我仍然无法纠正它…