2011-12-20 10 views
7

No encuentro ningún error en esta clase, pero Netbeans muestra continuamente símbolo rojo en esa clase. Clase esjava.lang.VerifyError: (clase: ea/Individual, método: <init> firma: (I) V) El constructor debe llamar a super() o this()

/* 
* 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; 
    } 
} 

El código está compilando pero conseguir error de ejecución.

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

En otra clase, en donde se utiliza la clase individual:

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

Este donde se está intantiated clase individual:

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

EDITAR

I Haven' t renombró el archivo manualmente. Toda la codificación se realizó en Netbeans. El único problema es cuando estoy creando una instancia de Individual.

Edit2

He copiado el proyecto otro lugar, todo es normal de nuevo. probablemente sea un error de Netbeans o JDK

+0

http://stackoverflow.com/questions/100107/reasons-of-getting-a-java-lang-verifyerror – stacker

+6

El código actual parece correcto , el problema podría estar en el uso de la clase Individual. ¿Cómo se crea una instancia de esto? – WoLfulus

+0

@stacker: no entendí un poco. Soy e newbie – user

Respuesta

5

Debe javap el archivo .class y comprobar si el el compilador generó una llamada a super() cerca del inicio de su constructor.

El verificador de JVM requiere que cualquier constructor (que no sea para Object, por supuesto) invoque (posiblemente indirectamente a través de otro constructor) es el constructor de la superclase. Normalmente, el compilador inserta una llamada al constructor de la superclase automáticamente si no lo hace, pero es posible que pueda confundirse al no hacerlo en algunas circunstancias (aunque el código presentado no parece tan complejo).

(Y, sí, usted tiene this y ind intercambiado en la mayoría de lugares en copy.)

4

Probablemente este no sea el problema, pero su método copy() está totalmente desordenado ... En lugar de copiar nada, simplemente restablece el objeto original y devuelve uno nuevo vacío. Si querías para crear copias del objeto, que debe hacer algo como esto:

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

y luego llamarlo así:

Individual newOne = oldOne.copy(); 
+0

¡Thnaks! ¡¡¡Qué he hecho!!! – user

+0

Me alegra ayudar, pero si esto solucionó tu problema, es por casualidad: P Comprueba la respuesta de Hot Licks para obtener una mejor explicación. – SuperTron

0

Hola tengo la misma experiencia con NetBeans. Estaba bastante enojado por eso, pero la solución es bastante fácil. Tienes que copiar crear proyectos nuevos y las mismas clases que en el no funcional. Luego, copie todos los textos de las clases del proyecto antiguo al proyecto nuevo y no olvide cambiar el nombre del paquete si no es el mismo. Su trabajo se ejecutará :)

1

Tuve el mismo problema en Netbeans. Limpiar y luego Build the project nuevamente lo resolvió para mí.

0

java.lang.VerifyError puede ser el resultado cuando se ha compilado contra una biblioteca diferente a la que está utilizando en el tiempo de ejecución.

Por ejemplo, esto me sucedió al intentar ejecutar un programa que se compiló contra Xerces 1, pero se encontró Xerces 2 en la ruta de clases. Las clases requeridas (en el espacio de nombres org.apache. *) Se encontraron en tiempo de ejecución, por lo que ClassNotFoundException no fue el resultado. Hubo cambios en las clases y los métodos, de modo que las firmas de métodos encontradas en el tiempo de ejecución no coincidían con lo que estaba allí en tiempo de compilación.

Normalmente, el compilador señalará problemas donde las firmas de métodos no coinciden. La JVM verificará nuevamente el bytecode cuando se cargue la clase, y arrojará VerifyError cuando el bytecode intente hacer algo que no debería permitirse, por ej. llamando a un método que devuelve String y luego almacena ese valor de retorno en un campo que contiene una lista. Esto es lo que obtuve, pero aún así no puedo corregirlo ...

Cuestiones relacionadas