1

これが私のコードです。並べ替えと印刷のメソッドで nullpointerexception が発生し続けます。これは、allAnimals.length の for ループのある行から始まります。クラス内の配列 allAnimal は、必要に応じて getData に入力されていないと思います。getData メソッドの allAnimal は、クラス内で allAnimal として扱われません。基本的に、他のすべてのメソッドは依然として allAnimal が null であると見なします。私はJavaのマスターではないので、誰かがこのエラーを修正する方法を教えてくれたり、それを回避する方法のヒントを教えてくれたりしたら、とても感謝しています.

public class Animal {
//data fields 
private String name;
private int birthYear;
private String species;
private float balance;
private String ownersName;
static Animal[] allAnimal;


public Animal(){
    //no-arg constructor 
}

public Animal(String name, int birthYear, String species, float balance, String ownersName){
    // constructor builds animal template
    this.name = name;
    this.birthYear = birthYear;
    this.species = species;
    this.balance = balance;
    this.ownersName = ownersName;
}


//set and get for name
public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

//set and get for birth year
public int getBirthYear() {
    return birthYear;
}

public void setBirthYear(int birthYear) {
    this.birthYear = birthYear;
}

//set and get for species
public String getSpecies() {
    return species;
}

public void setSpecies(String species) {
    this.species = species;
}

//set and get for balance
public float getBalance() {
    return balance;
}


public void setBalance(float balance) {
    this.balance = balance;
}

//set and get for owner
public String getOwnersName() {
    return ownersName;
}

public void setOwnersName(String ownersName) {
    this.ownersName = ownersName;
}







public static void getData(){

    System.out.println("How many animals are in this report? ");
    Scanner kb = new Scanner(System.in);

    int length = kb.nextInt();
    Animal[] allAnimal = new Animal[length]; 

    System.out.println("input: animal name, birth year, species, bill balance and owner's name.");
    //fill array of objects with data
    int i;
    for(i = 0; i < allAnimal.length; i++){

        allAnimal[i] = new Animal(kb.next(), kb.nextInt(), kb.next(), kb.nextFloat(), kb.next());
    }


}//end getData


public static void sortData(Animal[] allAnimal){
    Animal temp;
    int i,j;
    for(i = 0; i < allAnimal.length; i++){  
        for(j = i + 1; j < allAnimal.length; j++){


            if(allAnimal[i].getBalance() > allAnimal[j].getBalance() ){ //swap big with small
                temp = allAnimal[j];
                allAnimal[j] = allAnimal[i];
                allAnimal[i] = temp;
            }
        }
    }
}//end sortData


    public static void printData(Animal[] allAnimal){
        int i;
        for(i = 0; i < allAnimal.length; i++){
        System.out.println("Pet Name: " + allAnimal[i].getName() + " Birth year: " +
                allAnimal[i].getBirthYear() + " Species: " + allAnimal[i].getSpecies() +
                " Balance due: " + allAnimal[i].getBalance() + " Owner: " + allAnimal[i].getOwnersName());
        }
    }


   public static void main(String[] args){
       getData();
       sortData(allAnimal);
       printData(allAnimal);

   }//end main 

}//end class
4

3 に答える 3

2

という名前の 2 つの変数がありますallAnimal

static Animal[] allAnimal;
Animal[] allAnimal = new Animal[length]; 

1 つを初期化してから、もう 1 つを使用します (まだnullです)。

getData()、変更

Animal[] allAnimal = new Animal[length]; 

allAnimal = new Animal[length]; 

他の問題があるかもしれません、私はあまり詳しく見ていませんでした。

于 2013-10-26T07:01:40.977 に答える
0

問題の原因となったメソッドAnimal[] allAnimal内に ローカル変数を作成 しています。getData()

ここで問題

public static void getData(){

    Animal[] allAnimal = new Animal[length];  //here is the problem
}

以下のように修正します。

public static void getData(){

    allAnimal = new Animal[length];  //here is the fix
}
于 2013-10-26T07:04:15.390 に答える
0

クラス レベルでのみ AllAnimal を宣言しました。

static Animal[] allAnimal;

これで、メソッド getData() で、ローカル変数を宣言して初期化しましたallAnimal。クラスレベルのものとは何の関係もないことに注意してください。

Animal[] allAnimal = new Animal[length]; 

allAnimal他のメソッドでは、初期化されていない場合にヌル ポインターをスローするクラス レベルを使用しようとしています。

for(i = 0; i < allAnimal.length; i++){
于 2013-10-26T07:04:49.570 に答える