2017-09-29 149 views
-2

所以我在使用2个类和一个测试程序类的数组上进行项目,但我不断收到一个nullPointerException错误。我知道这个错误本质上意味着什么,我相信问题在于我在下面提供的Tank类和它的构造函数更具体。 Tank类使用我的类Fish,并且应该创建一个鱼类数组,测试人员然后创建一个新的Tank对象。nullPointerException错误让我疯狂

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

这里是坦克类:

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

,你可以看到,我想建立创建鱼对象数组的罐类中的重载的构造函数,但我有一些麻烦得到它的工作。我相信,这是我的错误是在我的测试类来:

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(); 

    } 
} 

任何帮助,将不胜感激

+3

异常消息告诉你在哪一行抛出异常。这将有助于查明哪些变量或对象为空。它也将帮助我们帮助你。 – DCON

+3

NullPointerException将打印行号。这是调试的关键信息! – tanyehzheng

+0

该死的我知道我忘了一些东西。下面是错误代码:显示java.lang.NullPointerException \t在Tank.addFish(Tank.java:23) \t在TankTest.main(TankTest.java:5) \t在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) \t at sun.reflect.NativeMethodAccessorImpl。调用(未知来源) \t在sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) \t在java.lang.reflect.Method.invoke(未知来源) \t在edu.rice.cs.drjava.model.compiler。 JavacCompiler.runCommand(JavacCompiler.java:267) – cavermendes

回答

0

我注意到,你有一个问题,在您的addFish方法:

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

所以,你的代码应该是这样的:

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

你应该增加日e index也是可变的。目前,您将在阵列的0位置添加所有Fish对象。

您还应该使用size变量而不是fishArray.length来避免到达数组的空元素。 此变量应在您的构造函数中初始化为0,与变量index相同。

您已经实例化了6个对象(鱼),但该数组有10个元素,其中4个未实例化。

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

这将create 10 fishfishArray

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

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

尝试改变getTotalWeight(), getLargest() and getSmallest() 到:

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

非常感谢穆罕默德。改变方法内部的fishArray.length来调整大小,并将index ++添加到addFish方法似乎有诀窍。测试人员现在正在像没有错误那样运行。 – cavermendes

+0

完美,你能检查这个答案是否正确? –