2011-12-20 60 views
7

Tôi không tìm thấy lỗi nào trong lớp này, nhưng Netbeans liên tục hiển thị biểu tượng màu đỏ trên lớp đó. Lớp học làjava.lang.VerifyError: (class: ea/Individual, phương thức: <init> chữ ký: (I) V) Constructor phải gọi super() hoặc 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; 
    } 
} 

Mã được biên dịch nhưng bị lỗi thời gian chạy.

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

Trong một lớp học, nơi lớp cá nhân đang được sử dụng:

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

này nơi lớp cá nhân đang được intantiated:

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

EDIT

tôi thiên đường' t đã đổi tên tệp theo cách thủ công. Tất cả các mã được thực hiện trong Netbeans. Vấn đề duy nhất là khi tôi tạo cá thể của Cá nhân.

EDIT2

tôi đã sao chép dự án nơi khác, mọi thứ đều bình thường trở lại. có thể là lỗi của Netbeans hoặc JDK

+0

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

+6

Mã hiện tại có vẻ chính xác , vấn đề có thể là việc sử dụng lớp Cá nhân. Làm thế nào để bạn tạo một thể hiện của nó? – WoLfulus

+0

@stacker: không hiểu một chút. Tôi e newbie – user

Trả lời

5

Bạn nên javap file .class và kiểm tra xem trình biên dịch tạo ra một cuộc gọi đến siêu() gần bắt đầu của nhà xây dựng của bạn.

Trình xác minh JVM yêu cầu bất kỳ hàm tạo nào (ngoại trừ đối tượng, dĩ nhiên) gọi (có thể gián tiếp thông qua một hàm tạo khác), đó là hàm tạo của lớp cha. Thông thường trình biên dịch chèn một cuộc gọi đến hàm tạo siêu lớp tự động nếu bạn không làm điều đó, nhưng có thể nó có thể bị nhầm lẫn vào việc không làm điều này trong một số trường hợp (mặc dù mã trình bày dường như không phức tạp).

(Và, vâng, bạn có thisind đổi chỗ ở hầu hết các nơi trong copy.)

4

Đây có thể không phải là vấn đề, nhưng phương pháp copy() của bạn hoàn toàn bị rối loạn ... Thay vì sao chép bất cứ thứ gì, nó thực sự chỉ đặt lại đối tượng gốc và trả về một đối tượng trống mới. Nếu bạn muốn có nó để tạo ra bản sao của đối tượng, bạn nên làm một cái gì đó như thế này:

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

và sau đó gọi nó như thế này:

Individual newOne = oldOne.copy(); 
+0

Thnaks! Tôi đã làm gì !!! – user

+0

Vui mừng được giúp đỡ, nhưng nếu điều này khắc phục được sự cố của bạn, đó là tình cờ: P Kiểm tra Licks Hot trả lời để có giải thích tốt hơn. – SuperTron

0

Hi tôi có kinh nghiệm tương tự với NetBeans. Tôi đã khá điên về nó, nhưng giải pháp là khá dễ dàng. Bạn phải sao chép tạo dự án mới và cùng các lớp như trong dự án không hoạt động. Sau đó sao chép tất cả các văn bản từ các lớp trong dự án cũ sang dự án mới và đừng quên thay đổi tên gói nếu nó không giống nhau. Công việc của bạn sau đó sẽ chạy :)

1

Tôi đã có cùng một vấn đề trong Netbeans. Sạch sẽ và sau đó xây dựng các dự án một lần nữa giải quyết nó cho tôi.

0

java.lang.VerifyError có thể là kết quả khi bạn đã biên dịch dựa vào thư viện khác với thư viện bạn đang sử dụng khi chạy.

Ví dụ, điều này xảy ra với tôi khi cố gắng chạy một chương trình được biên dịch dựa trên Xerces 1, nhưng Xerces 2 đã được tìm thấy trên đường dẫn lớp. Các lớp bắt buộc (trong không gian tên org.apache. *) Được tìm thấy trong thời gian chạy, do đó, ClassNotFoundException không phải là kết quả. Đã có những thay đổi đối với các lớp và các phương thức, do đó các chữ ký của phương thức được tìm thấy trong thời gian chạy không khớp với những gì đã có lúc biên dịch.

Thông thường, trình biên dịch sẽ gắn cờ các vấn đề mà chữ ký phương thức không khớp. JVM sẽ kiểm tra lại bytecode một lần nữa khi lớp được nạp và ném VerifyError khi mã byte cố gắng thực hiện điều gì đó không được phép - ví dụ: gọi một phương thức trả về String và sau đó lưu trữ giá trị trả về đó trong một trường có chứa một List. Đây là những gì tôi nhận được, Nhưng tôi vẫn không thể sửa nó ..

Các vấn đề liên quan