我没有在这个课程中发现任何错误,但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的错误
答案 0 :(得分:5)
你应该javap
.class文件并检查编译器是否在构造函数的开头附近生成了对super()的调用。
JVM验证程序要求任何构造函数(当然除了Object之外)调用(可能通过另一个构造函数间接)它是超类的构造函数。通常情况下,如果你不这样做,编译器会自动插入对超类构造函数的调用,但是在某些情况下可能会混淆不执行此操作(尽管提供的代码似乎并不复杂)。
(是的,您在this
的大多数地方都换了ind
和copy
。)
答案 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的字段中。这就是我得到的,但我仍然无法纠正它..