首页 > 解决方案 > 重复删除和创建对象时出现 ArrayIndexOutOfBoundsException

问题描述

我正在使用经典的 Nim 游戏构建对象,并且有一些处理玩家数据的方法。我在测试我的代码时遇到了这个问题,但无法弄清楚。

当我在数组中添加一个播放器时出现了这个问题,然后将其删除。然后,再次添加播放器。它显示:Index 1 out of bounds for length 1. 我尝试的是在删除玩家数据时过滤空位置。

非常感谢任何帮助。并感谢大家的耐心和时间来解决它!

代码有点长,但相关。这是来自 class Nimsys, main 方法的相关代码。

public static void addPlayer(String [] name) {
    if (name != null && name.length == 3) {
        for (int i = 0; i < NimPlayer.getCounter(); i++) {
            String userCheck = NimPlayer.getPlayer()[i].getUserName();
            if (userCheck.contains(name[0])) {
                System.out.println("The player already exists.\n");// Test if player has been created
                return;
            }
        }
        NimPlayer.createPlayer(name[0], name[1], name[2]);
        System.out.println("The player has been created.");
        return;
    } 
    System.out.println("Not Valid! Please enter again!");   
}

public static void searchAndRemovePlayer(String user) {
    NimPlayer [] playerList = NimPlayer.getPlayer();
    for (int i = 0; i < playerList.length; i++) {
        String userName =playerList[i].getUserName().trim();
        if (userName.equals(user)) {
            playerList[i] = null;
            System.out.println("Remove successfully!");
            NimPlayer.setPlayerList(playerList);
            return;
        }
    }
    System.out.println("The player does not exist.\n");

}

public static void main(String[] args) {
    System.out.println("Welcome to Nim\n");

    //Scanner in = new Scanner(System.in);

    while (true) {
        System.out.print('$');
        String commandin = in.next();

        if (commandin.equals("addplayer")) {
            String inputName = in.nextLine();
            String[] name = splitName(inputName);
            addPlayer(name);
        }

        if (commandin.equals("removeplayer")) {
            String user = in.nextLine().trim();

            if (user.equals("")) {
                System.out.println("Are you sure you want to remove all players? (y/n)");

                commandin = in.next();
                if (commandin.equals("y")) {
                    NimPlayer [] playerList = NimPlayer.getPlayer();
                    for (int i = 0; i < playerList.length; i++) {
                        playerList[i] = null;
                        NimPlayer.setPlayerList(playerList);
                    }
                    System.out.println("Remove all the players\n");
                    Arrays.stream(NimPlayer.getPlayer()).filter(Objects::nonNull).toArray();
                }
            }
            if (!user.equals("")) {
                searchAndRemovePlayer(user);
                Arrays.stream(NimPlayer.getPlayer()).filter(Objects::nonNull).toArray();
            }
        }

这是我的NimPlayer课的一部分:

public class NimPlayer {
private String userName;
private String familyName;
private String givenName;
private int score;
private int gamePlayed;

private static int counter;
private static final int SIZE = 10;
private static NimPlayer[] playerList = new NimPlayer[SIZE]; // set an array here


//define NimPlayer data type
public NimPlayer(String userName, String surName, String givenName) {
    this.userName = userName;
    this.familyName = surName;
    this.givenName = givenName;

}
// create new data using NimPlayer data type
public static void createPlayer(String userName, String familyName, String givenName) {
    if (counter < SIZE) {
        playerList[counter++] = new NimPlayer(userName, familyName, givenName);
    } else {
        System.out.println("Cannot add more players.");
    }
}
public static int getCounter() {
    return counter;
}
public static NimPlayer [] getPlayer() {   
    NimPlayer[] nimPlayers = Arrays.stream(playerList).filter(Objects::nonNull).toArray(NimPlayer[]::new);
    counter = nimPlayers.length;  //update the counter
    return nimPlayers;
}
public static void setPlayerList(NimPlayer [] newplayerList) {
    NimPlayer.playerList = newplayerList;

标签: javaarraysobject

解决方案


1.更换

if (commandin.equals("removeplayer")) {
    String user = in.nextLine().trim();

    if (user.equals("")) {
        System.out.println("Are you sure you want to remove all players? (y/n)");

        commandin = in.next();
        if (commandin.equals("y")) {
            NimPlayer [] playerList = NimPlayer.getPlayer();
            for (int i = 0; i < playerList.length; i++) {
                playerList[i] = null;
                NimPlayer.setPlayerList(playerList);
            }
            System.out.println("Remove all the players\n");
            Arrays.stream(NimPlayer.getPlayer()).filter(Objects::nonNull).toArray();
        }
    }
    if (!user.equals("")) {
        searchAndRemovePlayer(user);
        Arrays.stream(NimPlayer.getPlayer()).filter(Objects::nonNull).toArray();
    }
}

if (commandin.equals("removeplayer")) {
    String user = in.nextLine().trim();    
    if (user.isEmpty()) {
        System.out.println("Are you sure you want to remove all players? (y/n)");    
        commandin = in.nextLine();
        if (commandin.equalsIgnoreCase("y")) {
            NimPlayer [] playerList = NimPlayer.getPlayer();
            for (int i = 0; i < playerList.length; i++) {
                NimPlayer.removePlayer(playerList[i]);
            }
            System.out.println("Removed all the players\n");
        }
    } else {
        searchAndRemovePlayer(user);
    }
}

2. 更改以下方法,如下所示:

public static void searchAndRemovePlayer(String user) {
    NimPlayer[] playerList = NimPlayer.getPlayerList();
    for (int i = 0; i < playerList.length; i++) {
        String userName = playerList[i].getUserName().trim();
        if (userName.equals(user)) {
            NimPlayer.removePlayer(playerList[i]);
            System.out.println("The player, " + user + " removed successfully!");
            return;
        }
    }
    System.out.println("The player, " + user + "  does not exist.\n");
}

public static NimPlayer [] getPlayer() {       
    return Arrays.stream(playerList).filter(Objects::nonNull).toArray(NimPlayer[]::new);
}

2.您应该删除其设置器并创建类似于以下内容,而不是从外部公开playerList要设置的设置:publicpublic static void removePlayerpublic static void createPlayer

public static void removePlayer(NimPlayer player) {
    int i;
    for (i = 0; i < playerList.length; i++) {
        if (playerList[i] != null && playerList[i].getUserName().equals(player.getUserName())) {
            break;
        }
    }
    for (int j = i; j < playerList.length - 1; j++) {
        playerList[j] = playerList[j + 1];
    }
    counter--;
}

重要提示:切勿将设置操作放在 getter 中,就像您在方法中所做的那样,getPlayer().


推荐阅读