Java 初始化所有变量,但仍获取NullPointerExceptions错误

Java 初始化所有变量,但仍获取NullPointerExceptions错误,java,nullpointerexception,Java,Nullpointerexception,代码如下: public class Fisher{ private String name; private Fish [] fishCaught; private int numFishCaught; private int keepSize; public static int LIMIT =10; private boolean full; public int getnumFishCaught(){ retur

代码如下:

public class Fisher{

    private String name;
    private Fish [] fishCaught;
    private int numFishCaught;
    private int keepSize;
    public static int LIMIT =10;
    private boolean full;

    public int getnumFishCaught(){
        return numFishCaught;
    }
    public Fisher(String n,int k){
        this.name=n;
        this.keepSize=k;
        this.fishCaught =new Fish[LIMIT];

    }
    public String toString(){
        return this.name + " with " + numFishCaught+ " fish ";
    }
    public void keep(Fish f){
        if(numFishCaught<LIMIT){
            this.fishCaught[numFishCaught]=f;
            numFishCaught++;
            full=false;
        }else{
            full=true;
            numFishCaught=LIMIT;
        }

    }
    public boolean likes(Fish f1){
        if(f1.getSpecies().equals("Sunfish")){
            return false;
        }else{
            if(f1.getSize()>=this.keepSize){
                return true;
            }else{
                return false;
            }
        }
    }
    public void listFish(){

        System.out.println( this.name +" with "+ numFishCaught + " fish as follow: ");
        for(int i=0;i<numFishCaught;i++){
            System.out.println("A " + this.fishCaught[i].getSize() +" cm " + this.fishCaught[i].getSpecies());
        }
    }
    public void goFishingIn(Pond p){

        if(likes(p.catchAFish())){ // the problem happens here
            keep(p.catchAFish());
            if(full==true)
                p.add(p.catchAFish());
        }
    }
    public void giveAwayFish(Fisher f1,Pond pp){
        this.keepSize=f1.keepSize;
        for(int i=0;i<numFishCaught;i++){
            if(likes(fishCaught[i])==true){
                f1.keep(fishCaught[i]);
            }else{
                pp.add(fishCaught[i]);
            }
        }
    }
}
有谁能告诉我为什么
p.catchAFish()
likes(Fish f1)
中不是同一类型的鱼吗? 因为我认为
catchAFish
方法将返回一个Fish对象,该对象与
likes
方法中的输入类型相同

public class Fish {
    private String species;
    private int size;
    public String getSpecies(){
        return species;
    }
    public int getSize(){
        return size;
    }
    public Fish(int s, String ss){
        size=s;
        species=ss;
    }
    public String toString(){
        return "A " + size+"cm "+ species;
    }
}
测试等级:

public class FishingTestProgram2 { 
    public static void main(String [] args) { 
        // Create a big pond with 15 fish 
        Pond bigPond = new Pond(15); 
        bigPond.add(new Fish(4, "Sunfish")); 
        bigPond.add(new Fish(25, "Pike")); 
        bigPond.add(new Fish(20, "Bass")); 
        bigPond.add(new Fish(30, "Perch")); 
        bigPond.add(new Fish(14, "Sunfish")); 
        bigPond.add(new Fish(15, "Pike")); 
        bigPond.add(new Fish(9, "Pike")); 
        bigPond.add(new Fish(12, "Bass")); 
        bigPond.add(new Fish(5, "Sunfish")); 
        bigPond.add(new Fish(12, "Sunfish")); 
        bigPond.add(new Fish(10, "Bass")); 
        bigPond.add(new Fish(2, "Bass")); 
        bigPond.add(new Fish(16, "Perch")); 
        bigPond.add(new Fish(30, "Sunfish")); 
        bigPond.add(new Fish(7, "Perch")); 
        bigPond.listFish(); 

        // Create two people to fish in the pond 
        Fisher fred = new Fisher("Fred", 15); 
        Fisher suzy = new Fisher("Suzy", 10); 

        System.out.println("First Fred catches 20 fish in the big pond ..."); 
        for (int i=0; i<20; i++) 
            fred.goFishingIn(bigPond); 
        fred.listFish(); 

        System.out.println("Suzy now catches 20 fish in the big pond ..."); 
        for (int i=0; i<20; i++) 
            suzy.goFishingIn(bigPond); 
        suzy.listFish(); 

        System.out.println("Here is what is left of the pond ..."); 
        bigPond.listFish();
        // Now simulate Suzy giving her fish to Fred 
        suzy.giveAwayFish(fred, bigPond); 
        fred.listFish(); 
        suzy.listFish(); 
        bigPond.listFish();  
    } 
} 
公共类fishingtestprogramm2{
公共静态void main(字符串[]args){
//创建一个有15条鱼的大池塘
池塘大池塘=新池塘(15);
添加(新鱼(4,“太阳鱼”);
添加(新鱼(25,“梭子鱼”);
添加(新鱼(20,“鲈鱼”);
大池塘。添加(新鱼(30,“鲈鱼”);
添加(新鱼(14,“太阳鱼”);
添加(新鱼(15,“梭子鱼”);
添加(新鱼(9,“梭子鱼”);
添加(新鱼(12,“鲈鱼”);
添加(新鱼(5,“太阳鱼”);
添加(新鱼(12,“太阳鱼”);
添加(新鱼(10,“鲈鱼”);
添加(新鱼(2,“鲈鱼”);
添加(新鱼(16,“鲈鱼”);
添加(新鱼(30,“太阳鱼”);
添加(新鱼(7,“鲈鱼”);
大池塘;
//创建两个人在池塘中钓鱼
费希尔·弗雷德=新费希尔(“弗雷德”,15);
Fisher-suzy=新Fisher(“suzy”,10);
System.out.println(“第一个Fred在大池塘里抓了20条鱼…”);
for(int i=0;i
catchAFish()
返回null,因此当您调用
if(f1.getSpecies()=“Sunfish”)
时,您的
likes()
在likes中得到一个null引用,因为您正在传递
if(likes(p.catchAFish()){//问题发生在这里

我不知道如何调用
goFishingIn()
,您不提供该代码。但您很可能是在一个悲伤的空池塘中调用它

在使用catchAFish的返回值之前,您需要检查null,或者确保catchAFish永远不会返回null。现在它将返回null

好的,我明白你的主要功能了。问题是你在池塘里钓鱼

  public Fish catchAFish(){

    int num= (int)(Math.random() * (numFish-1));
    if(fish[num]!=null && numFish>0){
      fff= fish[num];
      fish[num]= fish[numFish-1];
      fish[numFish-1]=null;
      numFish--;
      return fff;
    }
    else
      return null;
  }
您将数组初始化为20,但每次钓鱼时都会删除整个fish类,因此当您调用
goFishingIn
时,您会从池塘中的鱼数组中删除一个fish对象

我认为您需要删除一条鱼,并且一旦该鱼种全部被打捞出来fish[num]==0,则删除该鱼

  public Fish catchAFish(){

    int num= (int)(Math.random() * (numFish-1));
    if(fish[num]!=null && numFish>0){
      fff= fish[num];
      fish[num]--;
      if (fish[num] == 0)
      { 
          // No more of this fish type, remove it from the pond.
          fish[num]= fish[numFish-1];
          fish[numFish-1]=null;
          numFish--;
      }
      return fff;
    }
    else
      return null;
  }

今天有很多…钓鱼…你是说:
intnum=(int)(Math.random()%(numFish-1));
?代码很长,但问题只存在于两种方法中:goFishingIn方法和likes方法。等待您的回复。谢谢您,%和*?之间有什么区别吗?
%
*
之间有什么区别吗?也许您应该阅读。这将解决此问题,但正如我所说的,但它无法解决发生的问题如果你的池塘真的没有鱼了。你应该检查null(或者更好的是,在池塘上创建一个
IsEmpty()
方法),并在你尝试先钓鱼之前进行检查。同时查看
列表来简化删除鱼的过程-。yeach我将首先修复pond类
  public Fish catchAFish(){

    int num= (int)(Math.random() * (numFish-1));
    if(fish[num]!=null && numFish>0){
      fff= fish[num];
      fish[num]= fish[numFish-1];
      fish[numFish-1]=null;
      numFish--;
      return fff;
    }
    else
      return null;
  }
  public Fish catchAFish(){

    int num= (int)(Math.random() * (numFish-1));
    if(fish[num]!=null && numFish>0){
      fff= fish[num];
      fish[num]--;
      if (fish[num] == 0)
      { 
          // No more of this fish type, remove it from the pond.
          fish[num]= fish[numFish-1];
          fish[numFish-1]=null;
          numFish--;
      }
      return fff;
    }
    else
      return null;
  }