У меня проблемы с массивом объектов. В основном, я определил следующее:
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[] 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];