2011-12-20 11 views
7

Nie znajduję żadnego błędu w tej klasie, ale Netbeans ciągle pokazuje czerwony symbol na tej klasie. Klasa tojava.lang.VerifyError: (klasa: ea/Individual, metoda: <init> podpis: (I) V) Konstruktor musi wywołać super() lub ten()

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

Kod jest kompilowany, ale pojawia się błąd runtime.

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

W innej klasy, gdzie jest używany klasa indywidualną:

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

ta, gdzie klasa indywidualna jest intantiated:

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

EDIT

I haven” t ręcznie zmieniono nazwę pliku. Całe kodowanie zostało wykonane w Netbeans. Jedyny problem występuje wtedy, gdy tworzę wystąpienie Indywidualności.

EDIT2

mam skopiowane projektowi inne miejsce, wszystko jest normalne ponownie. prawdopodobnie błąd Netbeans lub JDK

+0

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

+6

Aktualny kod wydaje się prawidłowy , problemem może być użycie klasy Indywidualności. Jak utworzyć jego instancję? – WoLfulus

+0

@stacker: nie rozumiem. Jestem nowicjuszem – user

Odpowiedz

5

Należy javap plik .class i sprawdzić, czy kompilator wygenerował wywołanie super() w pobliżu początku konstruktora.

Weryfikator JVM wymaga, aby każdy konstruktor (inny niż dla obiektu) wywoływał (prawdopodobnie pośrednio przez innego konstruktora) jego konstruktor nadklasy. Zwykle kompilator automatycznie wstawia wywołanie do konstruktora nadklasy, jeśli tego nie zrobi, ale możliwe, że można go pomylić, nie robiąc tego w pewnych okolicznościach (chociaż przedstawiony kod nie wydaje się taki złożony).

(I tak, masz this i ind zamienione w większości miejsc w copy.)

4

To prawdopodobnie nie jest problem, ale twoja metoda copy() jest kompletnie pomieszana ... Zamiast kopiować cokolwiek, w rzeczywistości po prostu resetuje oryginalny obiekt i zwraca nowy pusty. Jeśli chcesz go do tworzenia kopii obiektu, należy zrobić tak:

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

a następnie nazwać tak:

Individual newOne = oldOne.copy(); 
+0

Thnaks! Co ja zrobiłem!!! – user

+0

Cieszę się, że mogę Ci pomóc, ale jeśli to naprawi twój problem, jest to przypadek: P Sprawdź odpowiedź Hot Licks, aby uzyskać lepsze wyjaśnienie. – SuperTron

0

Witam mam takie same doświadczenia z NetBeans. Byłem bardzo szalony, ale rozwiązanie jest dość łatwe. Musisz skopiować tworzyć nowe projekty i te same klasy, co w wersji niefunkcjonalnej. Następnie skopiuj wszystkie teksty z klas w starym projekcie do nowego projektu i nie zapomnij zmienić nazwy pakietu, jeśli to nie to samo. Twoja praca zostanie uruchomiona :)

1

Miałem ten sam problem w Netbeans. Oczyść, a następnie Zbuduj projekt, aby rozwiązać go ponownie.

0

Wartość java.lang.VerifyError może być wynikiem kompilacji względem innej biblioteki niż w środowisku wykonawczym.

Na przykład przydarzyło mi się to podczas próby uruchomienia programu skompilowanego na Xerces 1, ale Xerces 2 został znaleziony w ścieżce klas. Wymagane klasy (w org.apache. * Namespace) zostały znalezione w czasie wykonywania, więc ClassNotFoundException nie było wynikiem. Nastąpiły zmiany w klasach i metodach, aby sygnatury metod znalezione w czasie wykonywania nie pasowały do ​​tego, co było podczas kompilacji.

Zwykle kompilator sygnalizuje problemy, które nie są zgodne z sygnaturami metod. JVM ponownie zweryfikuje kod bajtowy po załadowaniu klasy i zgłasza VerifyError, gdy kod bajtowy próbuje zrobić coś, co nie powinno być dozwolone - np. wywołanie metody, która zwraca ciąg, a następnie przechowuje tę zwracaną wartość w polu zawierającym listę. To jest to, co mam, ale nadal nie mogę tego poprawić ..

Powiązane problemy