Java NullPointException和对象数组的长度

Java NullPointException和对象数组的长度,java,arrays,oop,constructor,Java,Arrays,Oop,Constructor,我在处理一系列对象时遇到了很大的麻烦。基本上,我定义如下: public class PlayersList { private Player[] players; private int length; private int numPlayer = 0; } 在这种情况下,哪些播放器来自数据类型播放器: public class Player { public String UserName; public Player(String UserName) { this.UserName

我在处理一系列对象时遇到了很大的麻烦。基本上,我定义如下:

public class PlayersList
{
private Player[] players;
private int length;
private int numPlayer = 0;
}
在这种情况下,哪些播放器来自数据类型播放器:

public class Player
{
public String UserName;

public Player(String UserName)
{
this.UserName = UserName;      
}
}
现在,当我尝试调用涉及遍历对象数组或对象数组长度的方法时,我得到了一个NPE。我从一个3个成员的数组开始,我已经初始化了所有3个成员,所以我不会得到类似的结果。但是,如果我尝试使用以下内容:

  public Player findPlayer(String Player)
  {
    for(int i = 0; i < players.length; i++)
    {
      if(Player.equals(players[i].UserName))
      {
        return players[i];
      }
    }
    return null;
  }

您正在这里初始化一个本地数组

Player[] players = new Player[3];
改为这样做

players = new Player[3];

构造函数中的
players
变量是字段

public class PlayersList
{
    private Player[] players;

    public PlayersList()
    {
        // shadows the field
        Player[] players = new Player[3];

        ...
在构造函数中执行
Player[]players
,将声明一个同名的新变量。删除该类型后,它将成为字段的赋值,而不是声明:

    public PlayersList()
    {
        // now refers to the field
        players = new Player[3];

你能告诉我们你在数组中初始化
Player
对象的代码吗?很抱歉,我现在添加了它。我想在“Player”类周围应该有另一组大括号。首先,重要的是,不要使用与类相同的名称命名局部变量-不要使用
字符串播放器
,同时参考类
播放器
。java代码约定总是以小写字母开头变量名:
stringplayer
。这是一个很好的习惯,可以确保类和变量永远不会使用相同的名称。谢谢你的建议,我会记住的!非常感谢。这似乎一直是个问题。现在,出于好奇,这个本地数组到底发生了什么?在我创建它之后,它几乎丢失了,或者它有什么重要意义吗?当您使用构造函数时,您最终在堆内存中得到了数组,但是您没有对它的任何引用。因此,它可用于垃圾收集。当垃圾回收发生时,将从该对象中释放内存。
    public PlayersList()
    {
        // now refers to the field
        players = new Player[3];