初始化所有变量但仍然得到 NullPointerExceptions 错误 [英] initialize all variables but still get NullPointerExceptions error

查看:46
本文介绍了初始化所有变量但仍然得到 NullPointerExceptions 错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

代码如下:

公共类Fisher{私人字符串名称;私人鱼[]fishCaught;私人 int numFishCaught;私人 int keepSize;公共静态 int LIMIT = 10;私人布尔全;公共 int getnumFishCaught(){返回 numFishCaught;}公共费舍尔(字符串 n,int k){this.name=n;this.keepSize=k;this.fishCaught = 新鱼[限制];}公共字符串 toString(){返回 this.name + " with " + numFishCaught+ "fish";}公共无效保持(鱼f){if(numFishCaught=this.keepSize){返回真;}别的{返回假;}}}公共无效列表鱼(){System.out.println( this.name +" with "+ numFishCaught + " 鱼如下: ");for(int i=0;i

另外两个类,Fish 和 Pond,它们是:

公共类池塘{私鱼 [] 鱼;私人 int numFish;私人国际能力;私人布尔全;私人鱼fff;公共池塘(int c){容量=c;鱼=新鱼[容量];fff=新鱼(0,未知");}公共布尔 isFull(){if(numFish>容量){全=真;返回真;}别的{全=假;返回假;}}公共 int getNumFish(){返回 numFish;}公共无效添加(鱼f){如果(全==假){鱼[numFish]=f;numFish++;}}公共无效列表鱼(){System.out.println("池塘与" + numFish + " 鱼如下: ");for(int i=0;i0){fff=鱼[数量];鱼[num]=鱼[numFish-1];鱼[numFish-1]=空;numFish--;返回 fff;}别的返回空;}公共字符串 toString(){返回池塘与"+ numFish +"+fish[numFish];}}

堆栈跟踪:

java.lang.NullPointerException在 Fisher.likes(Fisher.java:34)在 Fisher.goFishingIn(Fisher.java:53)在 FishingTestProgram2.main(FishingTestProgram2.java:28)在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源)在 java.lang.reflect.Method.invoke(Unknown Source)

谁能告诉我为什么 p.catchAFish()likes(Fish f1) 中的类型不同?因为我认为 catchAFish 方法将返回一个与 likes 方法中的输入类型相同的 Fish 对象.

公共类鱼{私有字符串物种;私有整数大小;公共字符串 getSpecies(){回归物种;}公共 int getSize(){退货尺寸;}公共鱼(整数 s,字符串 ss){大小=s;物种=ss;}公共字符串 toString(){返回A"+尺寸+cm"+物种;}}

测试类:

公共类 FishingTestProgram2 {公共静态无效主(字符串 [] args){//创建一个有 15 条鱼的大池塘池塘 bigPond = 新池塘(15);bigPond.add(new Fish(4, "Sunfish"));bigPond.add(new Fish(25, "Pike"));bigPond.add(new Fish(20, "Bass"));bigPond.add(new Fish(30, "鲈鱼"));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, "鲈鱼"));bigPond.add(new Fish(30, "Sunfish"));bigPond.add(new Fish(7, "Perch"));bigPond.listFish();//创建两个人在池塘里钓鱼费舍尔弗雷德 = 新费舍尔(弗雷德",15);Fisher suzy = new Fisher("Suzy", 10);System.out.println("第一个弗雷德在大池塘里钓到了20条鱼......");for (int i=0; i<20; i++)fred.goFishingIn(bigPond);fred.listFish();System.out.println("Suzy 现在在大池塘里钓到了 20 条鱼......");for (int i=0; i<20; i++)suzy.goFishingIn(bigPond);suzy.listFish();System.out.println("这是池塘的剩余部分……");bigPond.listFish();//现在模拟 Suzy 把她的鱼给 Fredsuzy.giveAwayFish(fred, bigPond);fred.listFish();suzy.listFish();bigPond.listFish();}}

字符串比较行是正确的,我在尝试解决问题时更改了它.调试是这样说的.意味着鱼和 p.表示 (int, string) 我需要用相同的类型初始化这两个东西,但我不知道如何更改它.

解决方案

catchAFish() 正在返回 null,因此您的 likes() 在 likes 中获得了 null 引用当你调用 if(f1.getSpecies()=="Sunfish") 因为你传入 if(likes(p.catchAFish())){//问题发生在这里.

我不知道如何调用 goFishingIn(),您不提供该代码.但你很可能用一个悲伤的空池塘来称呼它.

您要么需要在使用 catchAFish 的返回值之前检查 null,要么确保 catchAFish 永远不会返回 null.现在会的.

好的 - 我看到了你的主要功能.问题是你出去钓鱼了.

 public Fish catchAFish(){int num= (int)(Math.random() * (numFish-1));if(fish[num]!=null &&numFish>0){fff=鱼[数量];鱼[num]=鱼[numFish-1];鱼[numFish-1]=空;numFish--;返回 fff;}别的返回空;}

您将数组初始化为 20,但是每次钓鱼时,您都会删除整个 Fish 类,因此当您调用 goFishingIn 时,您正在从池塘中的鱼数组中删除一个 Fish 对象.

我认为您想移除一条鱼,一旦该鱼种被全部捞出,fish[num] == 0,然后移除这条鱼.

 public Fish catchAFish(){int num= (int)(Math.random() * (numFish-1));if(fish[num]!=null &&numFish>0){fff=鱼[数量];鱼[数量]--;如果(鱼[数量] == 0){//不再有这种鱼,将其从池塘中移除.鱼[num]=鱼[numFish-1];鱼[numFish-1]=空;numFish--;}返回 fff;}别的返回空;}

Here is the code:

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

And the other two classes, Fish and Pond, which are:

public class Pond {

    private Fish [] fish;
    private int numFish;
    private int capacity;
    private boolean full;
    private Fish fff;

    public Pond(int c){

        capacity=c;
        fish= new Fish[capacity];
        fff= new Fish(0,"UNKNOWN");
    }
    public boolean isFull(){

        if(numFish>capacity){
            full=true;
            return true;
        }
        else{
            full=false;
            return false;
        }
    }
    public int getNumFish(){
        return numFish;
    }

    public void add(Fish f){

        if(full==false){
            fish[numFish]=f;
            numFish++;
        } 
    } 
    public void listFish(){

        System.out.println("Pond with " + numFish + " fish as follow: ");
        for(int i=0;i<numFish;i++){
            System.out.println("A " + fish[i].getSize() +" cm " + fish[i].getSpecies());
        }
    }
    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 String toString(){
        return "Pond with "+  numFish +" "+ fish[numFish];
    }
}

Stacktrace:

java.lang.NullPointerException
    at Fisher.likes(Fisher.java:34)
    at Fisher.goFishingIn(Fisher.java:53)
    at FishingTestProgram2.main(FishingTestProgram2.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)

Could anyone tell me why p.catchAFish() is not the same type in likes(Fish f1)? because I think catchAFish method will return a Fish object which is same as the input type in likes method.

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

Test class:

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

The string compare line was right I change it whileI was trying to solve the problem. The debugging says this. means Fish and p. means (int, string) I need to initialize these two thing in same type, but I don't know how to change it.

解决方案

catchAFish() is returning null and so your likes() is getting a null reference in likes when you call if(f1.getSpecies()=="Sunfish") because you are passing in if(likes(p.catchAFish())){ // the problem happens here.

I don't see how goFishingIn() is is called, you don't supply that code. But you are most likely calling it with an sad empty pond.

You either need to check for null before using the return value of catchAFish, or ensure that catchAFish will never return null. Right now it will.

Okay - I see your main function. The problem is you are out fishing your 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;
  }

You initalize your array to 20, but each time you fish you are removing a whole Fish class, so when you call goFishingIn you are removing one Fish object from your fish array in pond.

I think you want to remove a single fish, and once that fish species is all fished out fish[num] == 0, then remove the fish.

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

这篇关于初始化所有变量但仍然得到 NullPointerExceptions 错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆