2017-09-29 3 views
-2

Also mache ich ein Projekt auf Arrays mit 2 Klassen und eine Tester-Klasse, aber ich bekomme immer eine NullPointerException Fehler. Ich weiß, was der Fehler im Wesentlichen bedeutet, und ich glaube, das Problem liegt in meiner Tank-Klasse, die unten angegeben ist, und in ihrem Konstruktor, um genauer zu sein. Die Tank-Klasse verwendet meine Klasse Fisch und soll ein Array von Fischen erstellen, und der Tester erstellt dann ein neues Tank-Objekt.nullPointerException Fehler treibt mich verrückt

public class Fish{ 

    private int weight; 
    private String name; 

    public Fish(int w, String n){ 
    weight = w; 
    name = n; 
    } 

    public void feed(){ 
    weight = weight + 5; 
    } 

    public int getWeight(){ 
    return weight; 
    } 

    public void setWeight(int w){ 
    weight = w; 
    } 

    public void setName(String n){ 
    name = n; 
    } 

    public String getName(){ 
    return name; 
    } 

    public void starve(){ 
    weight = weight -5; 
    } 

    public String toString(){ 
    return name +"'s weight is: " + getWeight(); 
    } 
} 

Hier ist die Tank-Klasse:

import java.util.ArrayList; 
public class Tank{ 

    private boolean isFish = true; 
    private int size; 
    private int index = 0; 
    private Fish[] fishArray; 
    private ArrayList<Fish> fishTank = new ArrayList<Fish>(); 

    public Tank(int i){ 
    fishArray = new Fish[i]; 
    } 

    public Tank(){ 
    fishArray = new Fish[10]; 
    } 

    public void feedFish(int i){ 
    fishArray[i].feed(); 
    } 

    public void addFish(Fish f){ 
    fishArray[index] = f; 
    size++; 
    } 

    public void starveFish(int i){ 
    fishArray[i].starve(); 
    } 

    public String getNameFor(int i){ 
    return (fishArray[i].getName()); 
    } 

    public int getWeightFor(int i){ 
    return (fishArray[i].getWeight()); 
    } 

    public int getTotalWeight(){ 
    int w = 0; 
    for(int i =0; i< fishArray.length; i++){ 
     w = fishArray[i].getWeight() + w; 
    } 
    return w; 
    } 

    public Fish getLargest(){ 
    int heaviest = Integer.MIN_VALUE; 
    for(int i = 0; i < fishArray.length; i++){ 
     if (fishArray[i].getWeight() > heaviest) 
     heaviest = fishArray[i].getWeight(); 
     index = i; 
    } 
    return fishArray[index]; 
    } 

    public Fish getSmallest(){ 
    int small = Integer.MAX_VALUE; 
    for(int i = 0; i < fishArray.length; i++){ 
     if (fishArray[i].getWeight() < small) 
     small = fishArray[i].getWeight(); 
     index=i; 
    } 
    return fishArray[index]; 
    } 

    public boolean doesExist(Fish f){ 
    for(int i = 0; i < fishArray.length; i++){ 
     if(fishArray[i].getWeight() == f.getWeight() && fishArray[i].getName().equalsIgnoreCase(f.getName())) 
     isFish = true; 
     else isFish = false; 
    } 
    return isFish; 
    } 

    public ArrayList<Fish> transfer(){ 
    for(int i = 0; i < fishArray.length; i ++){ 
     fishTank.add(fishArray[i]);} 
    return fishTank; 
    } 
} 

wie Sie sehen können, ich versuche, einen überladenen Konstruktor im Tank-Klasse zu bauen, die ein Array von Fisch-Objekte erstellt, aber ich bin etwas mit Schwierigkeiten, es zur Arbeit zu bringen. Ich glaube, das ist, wo mein Fehler von meinem Tester Klasse kommt:

public class TankTest{ 
    public static void main(String[] args) { 

    Tank tank = new Tank(); 
    tank.addFish(new Fish(10, "Doris")); 
    tank.addFish(new Fish(12, "Marlin")); 
    tank.addFish(new Fish(7, "nemo")); 
    tank.addFish(new Fish(15, "bubbles")); 
    tank.addFish(new Fish(18, "gill")); 
    tank.addFish(new Fish(5, "peach")); 

    tank.feedFish(3); 
    tank.starveFish(2); 
    tank.starveFish(4); 
    tank.feedFish(5); 
    tank.starveFish(1); 
    tank.feedFish(0); 
    tank.feedFish(2); 
    tank.starveFish(5); 
    tank.starveFish(1); 
    tank.feedFish(3); 
    tank.feedFish(1); 
    tank.feedFish(5); 
    tank.starveFish(0); 



    System.out.println("The total weight is : " + tank.getTotalWeight()); 
    System.out.println("The largest Fish is : " + tank.getLargest().getName()); 
    System.out.println("The smallest Fish is : " + tank.getSmallest().getName()); 

    tank.transfer(); 

    } 
} 

Jede mögliche Hilfe

+3

Die Ausnahmebedingungsnachricht teilt Ihnen mit, in welcher Zeile die Ausnahme ausgelöst wird. Das wird helfen, genau zu bestimmen, welche Variable oder welches Objekt Null ist. Es hilft uns auch, Ihnen zu helfen. – DCON

+3

Die NullPointerException hätte die Zeilennummer gedruckt. Das sind wichtige Informationen zum Debuggen! – tanyehzheng

+0

Verdammt, ich wusste, dass ich etwas vergessen habe. Hier ist der Fehlercode: java.lang.NullPointerException \t bei Tank.addFish (Tank.java:23) \t bei TankTest.main (TankTest.java:5) \t bei sun.reflect.NativeMethodAccessorImpl.invoke0 (native Methode) \t bei sun.reflect.NativeMethodAccessorImpl.aufrufen (Unknown Source) \t bei sun.reflect.DelegatingMethodAccessorImpl.invoke (Unknown Source) \t bei java.lang.reflect.Method.invoke (Unknown Source) \t bei edu.rice.cs.drjava.model.compiler. JavacCompiler.runCommand (JavacCompiler.java:267) – cavermendes

Antwort

0

klar sein, bemerkte ich, dass Sie auf Ihrer addFish Methode ein Problem haben:

public void addFish(Fish f){ 
    fishArray[index] = f; 
    size++; 
} 

So sollte der Code wie folgt sein:

public void addFish(Fish f){ 
    fishArray[index] = f; 
    index++; 
    size++; 
} 

Sie th erhöhen sollte e index Variable auch. Derzeit fügen Sie alle Fish Objekte an der 0-Position Ihres Arrays hinzu.

Sie sollten auch die size Variable anstelle von fishArray.length verwenden, um zu vermeiden, null Elemente Ihres Arrays zu erreichen. Diese Variable sollte in Ihren Konstruktoren wie in index Variable 0 initialisiert werden.

Sie haben 6 Objekte (Fische) instanziiert, aber das Array hat 10 Elemente, von denen 4 nicht instanziiert wurden.

public Tank(){ 
    fishArray = new Fish[10]; 
} 

dies create 10 fish in fishArray

fishArray[0] = new fish() 
fishArray[1] = new fish() 
... 
fishArray[5] = new fish(); 

aber

fishArray[6] = null 
fishArray[7] = null 
fishArray[8] = null 
fishArray[9] = null 

Versuch zu ändern getTotalWeight(), getLargest() and getSmallest() zu:

public int getTotalWeight(){ 
 
    int w = 0; 
 
    for(int i =0; i< size; i++){ 
 
     w = fishArray[i].getWeight() + w; 
 
    } 
 
    return w; 
 
    } 
 

 
    public Fish getLargest(){ 
 
    int heaviest = Integer.MIN_VALUE; 
 
    for(int i = 0; i < size; i++){ 
 
     if (fishArray[i].getWeight() > heaviest) { 
 
      heaviest = fishArray[i].getWeight(); 
 
      index = i; 
 
     }    
 
    } 
 
    return fishArray[index]; 
 
    } 
 

 
    public Fish getSmallest(){ 
 
    int small = Integer.MAX_VALUE; 
 
    for(int i = 0; i < size; i++){ 
 
     if (fishArray[i].getWeight() < small) { 
 
      small = fishArray[i].getWeight(); 
 
      index=i; 
 
     }    
 
    } 
 
    return fishArray[index]; 
 
    }

+0

Vielen Dank Mohamed. Das Ändern der fishArray.length-Methode innerhalb der Methoden zur Größenanpassung und das Hinzufügen von Index ++ zur addFish-Methode schien den Zweck zu erfüllen. Der Tester läuft jetzt wie es sein soll, ohne Fehler. – cavermendes

+0

Perfekt, können Sie diese Antwort als richtig überprüfen? –

Verwandte Themen