【问题标题】:NullPointException and length of an array of objectsNullPointErexception 和对象数组的长度
【发布时间】:2014-04-21 10:19:14
【问题描述】:

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

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 成员数组开始,并且我已经初始化了所有三个成员,所以我不会得到类似的东西。但是,如果我尝试使用类似的东西:

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

在涉及播放器数组元素或其长度的其他类型的代码中,我得到一个 NPE。我做错了什么?有什么办法可以避免这种情况,或者有人可以告诉我我错过了什么吗?非常感谢。

编辑:这里是初始化数组中玩家的代码:

 public PlayersList()
  {
    Player[] players = new Player[3];
    players[0] = new Player("Hi");
    players[1] = new Player("Bla");
    players[2] = new Player("Foo");
    length = 3;
  }

【问题讨论】:

  • 你能告诉我们你初始化数组中Player对象的代码吗?
  • 抱歉,我已经添加了。
  • 我认为“Player”类周围应该有另一组大括号。
  • 首先,重要的是不要将局部变量命名为与类同名 - 不要使用 String Player 并同时引用类 Player . Java 代码约定说总是以小写开头的变量名:String player。这是一个好习惯,可确保您永远不会为类和变量使用相同的名称。
  • 感谢您的建议,我会记住的!

标签: java arrays oop constructor


【解决方案1】:

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

Player[] players = new Player[3];

改为这样做

players = new Player[3];

【讨论】:

  • 谢谢!这似乎是一直以来的问题。现在,出于纯粹的好奇,这个本地数组到底发生了什么?在我创建它之后,它几乎丢失了,或者它有什么重要性?
  • 当你用完构造函数后,你最终会得到堆内存中的数组,但你没有对它的任何引用。所以它可用于垃圾收集。当垃圾回收发生时,该对象的内存将被释放。
【解决方案2】:

您在构造函数中的players 变量是shadowing 字段。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-01
    • 2019-11-10
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 2017-03-29
    相关资源
    最近更新 更多