Java 的新手:出于某种原因,我在我的 for 循环中得到该值为 null,但是如果我将 i 更改为 0,它就不是 null
New to Java: For some reason I get that the value is null in my for loop, but if I change i to 0 it is not null
主要问题出在 findFish 方法中。我在 for 循环中初始化了 i=0,但这给了我错误“无法调用“com.company.Fish.getName()”,因为“this.fishInLake[x]”为空”。但是,如果我将 i 更改为 0,它会给出 false,这是正确的结果。我有点
package com.company;
import java.util.Arrays;
public class Lake {
private String name;
private double length;
private double width;
private double depth;
private final int amountOfFish;
private int currentFishAmount = 0 ;
private Fish[] fishInLake;
Lake(String name, double length, double width, double depth, int amountOfFish)
{
this.name = name;
this.length = length;
this.width = width;
this.depth = depth;
this.amountOfFish = amountOfFish;
this.fishInLake = new Fish[amountOfFish];
}
public void addFish (String name, double length, double weight)
{
fishInLake[currentFishAmount]= new Fish(name, length, weight);
System.out.println("Lake: " + this.name + "|" + "Fish:" + ""+ fishInLake[currentFishAmount].getName() + fishInLake[currentFishAmount].getLength());
System.out.println(currentFishAmount);
currentFishAmount++;
System.out.println(Arrays.toString(fishInLake));
}
**public boolean findFish(String fishName)
{
boolean isFound = false;
for (int i = 0; i < fishInLake.length; i ++)
{
if (fishInLake[i].getName() == fishName)
{
isFound = true;
}
}
return isFound;
}**
}
this.fishInLake = new Fish[amountOfFish];
这将创建一个数组,可以存储指向 amountOfFish
条鱼的指针。
一点鱼都没有.
您现在有一个当前存储 amountOfFish
null
个值的数组。
如果你想要真正的鱼,做一个for循环for (int i = 0; i < fishInLake.length; i++) fishInLake[i] = new Fish(...);
fishInLake.length
returns 数组的插槽数。它不会通过并计算其中实际的鱼指针数量。
fishInLake[i].getName()
点运算符取消引用。如果您尝试取消引用 null,则会发生 NullPointerException。
fishInLake[i].getName() == ...
这是比较指针。这不是你想要的。您对名称是否相同感兴趣。你想要 fishInLake[i].getName().equals(....)
而不是。
每次调用 addFish
时,都会创建一个新的 fish 对象,然后用指向它的指针替换插槽 currentFishAmount
中的任何内容。
鉴于此 currentFishAmount
从 0
开始并且每次递增,这大致完成了 'adding a fish'.
的工作
但是,您的 findFish 方法会查看每个可用槽并取消引用它在其中找到的引用。它应该只从 0 到 currentFishAmount
(这意味着如果还没有添加任何鱼就不会看任何东西,但这是正确的做法)。
您的代码无法正常工作的原因是,当您使用 == 或 equals() 方法比较空项时,您的代码将抛出错误。另请注意,在使用字符串时,您应该使用 .equals() 方法而不是 ==
这是一个示例测试用例:
System.out.println(n.findFish("shrimp"));
System.out.println(n.findFish("babbgdshogj"));
预期输出为:
true
false
以下代码通过确保数组中的元素不为空来实现:
public boolean findFish(String fishName)
{
boolean isFound = false;
for (int i = 0; i < fishInLake.length; i ++)
{
if (fishInLake[i] != null && fishInLake[i].getName().equals(fishName))
{
isFound = true;
}
}
return isFound;
}
主要问题出在 findFish 方法中。我在 for 循环中初始化了 i=0,但这给了我错误“无法调用“com.company.Fish.getName()”,因为“this.fishInLake[x]”为空”。但是,如果我将 i 更改为 0,它会给出 false,这是正确的结果。我有点
package com.company;
import java.util.Arrays;
public class Lake {
private String name;
private double length;
private double width;
private double depth;
private final int amountOfFish;
private int currentFishAmount = 0 ;
private Fish[] fishInLake;
Lake(String name, double length, double width, double depth, int amountOfFish)
{
this.name = name;
this.length = length;
this.width = width;
this.depth = depth;
this.amountOfFish = amountOfFish;
this.fishInLake = new Fish[amountOfFish];
}
public void addFish (String name, double length, double weight)
{
fishInLake[currentFishAmount]= new Fish(name, length, weight);
System.out.println("Lake: " + this.name + "|" + "Fish:" + ""+ fishInLake[currentFishAmount].getName() + fishInLake[currentFishAmount].getLength());
System.out.println(currentFishAmount);
currentFishAmount++;
System.out.println(Arrays.toString(fishInLake));
}
**public boolean findFish(String fishName)
{
boolean isFound = false;
for (int i = 0; i < fishInLake.length; i ++)
{
if (fishInLake[i].getName() == fishName)
{
isFound = true;
}
}
return isFound;
}**
}
this.fishInLake = new Fish[amountOfFish];
这将创建一个数组,可以存储指向 amountOfFish
条鱼的指针。
一点鱼都没有.
您现在有一个当前存储 amountOfFish
null
个值的数组。
如果你想要真正的鱼,做一个for循环for (int i = 0; i < fishInLake.length; i++) fishInLake[i] = new Fish(...);
fishInLake.length
returns 数组的插槽数。它不会通过并计算其中实际的鱼指针数量。
fishInLake[i].getName()
点运算符取消引用。如果您尝试取消引用 null,则会发生 NullPointerException。
fishInLake[i].getName() == ...
这是比较指针。这不是你想要的。您对名称是否相同感兴趣。你想要 fishInLake[i].getName().equals(....)
而不是。
每次调用 addFish
时,都会创建一个新的 fish 对象,然后用指向它的指针替换插槽 currentFishAmount
中的任何内容。
鉴于此 currentFishAmount
从 0
开始并且每次递增,这大致完成了 'adding a fish'.
但是,您的 findFish 方法会查看每个可用槽并取消引用它在其中找到的引用。它应该只从 0 到 currentFishAmount
(这意味着如果还没有添加任何鱼就不会看任何东西,但这是正确的做法)。
您的代码无法正常工作的原因是,当您使用 == 或 equals() 方法比较空项时,您的代码将抛出错误。另请注意,在使用字符串时,您应该使用 .equals() 方法而不是 ==
这是一个示例测试用例:
System.out.println(n.findFish("shrimp"));
System.out.println(n.findFish("babbgdshogj"));
预期输出为:
true
false
以下代码通过确保数组中的元素不为空来实现:
public boolean findFish(String fishName)
{
boolean isFound = false;
for (int i = 0; i < fishInLake.length; i ++)
{
if (fishInLake[i] != null && fishInLake[i].getName().equals(fishName))
{
isFound = true;
}
}
return isFound;
}