java - 重复删除和创建对象时出现 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;
解决方案
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
要设置的设置:public
public static void removePlayer
public 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()
.
推荐阅读
- python - 用于移动文件的 Python 脚本在 1486 个文件处停止
- php - 除法余数返回 2 零
- microservices - 将单体应用拆分为微服务时如何定义 API 网关 URL
- react-native - 在 react-native 中更新 redux 状态后重新渲染屏幕
- java - 在完成未来成功后显示通知
- android - AndroidX 找不到 support-v4.aar
- elastic-stack - Filebeat 给出:[error] 的对象映射尝试将字段 [error] 解析为对象,但找到了具体值
- html - ol>li 编号变得混乱
- javascript - 使用 JavaScript 使 AngularJS 表单页面变脏
- unity3d - 在 DLL 中使用带有统一性的 MessagePack