java.lang.VerifyError: (класс: ea / Individual, метод: <init>signature: (I) V) Конструктор должен вызывать super () или this () - PullRequest
7 голосов
/ 20 декабря 2011

Я не нахожу ошибок в этом классе, но 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()

В другом классе, где используется отдельный класс:

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

Этогде индивидуальный класс создается:

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

РЕДАКТИРОВАТЬ

Я не переименовал файл вручную.Все кодирование было сделано в Netbeans.Единственная проблема, когда я создаю экземпляр Individual.

EDIT2

Я скопировал проект в другое место, все снова нормально.возможно ошибка Netbeans или JDK

Ответы [ 5 ]

5 голосов
/ 20 декабря 2011

Вы должны javap файл .class и проверить, сгенерировал ли компилятор вызов super () в начале вашего конструктора.

Для верификатора JVM требуется любой конструктор (кроме Object,конечно) вызвать (возможно косвенно через другой конструктор) конструктор суперкласса.Обычно компилятор вставляет вызов в конструктор суперкласса автоматически, если вы этого не делаете, но возможно, что он может быть сбит с толку тем, что не делает этого при некоторых обстоятельствах (хотя представленный код не кажется таким сложным).

(И, да, у вас this и ind поменялись местами в большинстве мест в copy.)

4 голосов
/ 20 декабря 2011

Возможно, это не проблема, но ваш метод 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();
1 голос
/ 20 мая 2013

У меня была такая же проблема в Netbeans. Очистить, а затем построить проект снова решил его за меня.

0 голосов
/ 02 сентября 2013

java.lang.VerifyError может быть результатом, когда вы скомпилировали против библиотеки, отличной от используемой во время выполнения.

Например, это случилось со мной при попытке запустить программу, скомпилированную дляXerces 1, но Xerces 2 был найден на пути к классам.Обязательные классы (в пространстве имен org.apache. *) Были найдены во время выполнения, поэтому ClassNotFoundException не было результатом.В классы и методы были внесены изменения, поэтому сигнатуры методов, найденные во время выполнения, не совпадали с тем, что было во время компиляции.

Обычно компилятор будет отмечать проблемы, когда сигнатуры методов не совпадают.JVM проверит байт-код еще раз, когда класс загружен, и выдает VerifyError, когда байт-код пытается сделать что-то, что не должно быть разрешено - например, вызывает метод, который возвращает String, а затем сохраняет это возвращаемое значение в поле, которое содержитСписок.Это то, что я получил, но все еще не могу это исправить ..

0 голосов
/ 02 марта 2012

Привет, у меня такой же опыт с NetBeans.Я был без ума от этого, но решение довольно простое.Вы должны копировать создавать новые проекты и те же классы, что и в нефункциональных.Затем скопируйте все тексты из классов старого проекта в новый проект и не забудьте изменить имя пакета, если оно не совпадает.Ваша работа будет запущена:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...