NullPointException и длина массива объектов

1

У меня проблемы с массивом объектов. В основном, я определил следующее:

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;
  }
Теги:
arrays
oop
constructor

2 ответа

1
Лучший ответ

Вы инициализируете локальный массив здесь

Player[] players = new Player[3];

Сделайте это вместо этого

players = new Player[3];
  • 0
    Спасибо! Кажется, это было проблемой все время. Теперь, из чистого любопытства, что на самом деле происходит с этим локальным массивом? После того, как я его создал, он в значительной степени потерян или имеет какое-то значение?
  • 0
    Когда вы закончите с конструктором, вы получите массив в куче памяти, но у вас нет на него никаких ссылок. Так что это доступно для сбора мусора. Память будет освобождена от этого объекта, когда произойдет сборка мусора.
1

Ваша переменная 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];

Ещё вопросы

Сообщество Overcoder
Наверх
Меню