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