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 中的任何内容。

鉴于此 currentFishAmount0 开始并且每次递增,这大致完成了 '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;
}