基于ArrayList重构NimGame玩家管理功能异常求助
我帮你梳理下代码里的几个关键问题,这些逻辑bug就是导致功能异常的原因:
1. 添加玩家功能的逻辑错误
在Nimsys的addplayer方法里,有两个核心问题:
- 第一个玩家无法添加:当
playerList是空的时候,for (NimPlayer player: playerList)这个循环根本不会执行,所以你输入第一个玩家信息后,代码直接跳过了创建逻辑,玩家根本没被加入列表。 - 重复创建或误判玩家存在:循环里的逻辑是「只要当前遍历的玩家用户名不匹配,就立即创建新玩家」,这会导致如果列表里有多个玩家,只要有一个不匹配就会重复创建;而且用
contains判断用户名也不准确,比如userName是alice和alice1会被误判为重复。
修复后的addplayer方法:
private void addplayer(Scanner in) { String inName = in.nextLine().trim(); String[] name = splitName(inName); if (name != null && name.length == 3) { ArrayList<NimPlayer> playerList = nimModel.getPlayerList(); boolean playerExists = false; // 先遍历所有玩家,检查是否已存在 for (NimPlayer player : playerList) { // 用equals精准匹配用户名,避免部分匹配的误判 if (player.getUserName().equals(name[0])) { playerExists = true; break; } } if (playerExists) { System.out.println("The player already exists."); } else { nimModel.createPlayer(name[0], name[1], name[2]); System.out.println("The player has been created."); } } else { // 补充输入格式错误的提示,提升用户体验 System.out.println("Invalid input format. Please enter as: userName,familyName,givenName"); } }
2. 删除玩家功能的空指针与逻辑错误
NimModel的removePlayer方法有两个严重问题:
- 空指针异常隐患:类里的
nimplayer成员变量从未被初始化,调用nimplayer.getUserName()时会直接抛出NullPointerException(如果你执行removeplayer命令的话)。 - 逻辑完全错误:你应该拿传入的
userName参数和列表中玩家的用户名对比,而不是用未初始化的nimplayer;而且找到匹配玩家后,应该返回该玩家,而不是始终返回null,同时直接在for-each循环中删除元素还会触发ConcurrentModificationException。
修复后的removePlayer方法(同时删除无用的nimplayer成员变量):
public class NimModel { // 删除多余的private NimPlayer nimplayer; private ArrayList<NimPlayer> playerList = new ArrayList<>(); public void createPlayer(String userName, String familyName, String givenName) { NimPlayer player = new NimPlayer(userName, familyName, givenName); playerList.add(player); } public ArrayList<NimPlayer> getPlayerList() { return playerList; } public NimPlayer removePlayer(String userName) { // 使用Iterator遍历,避免修改集合时的并发异常 for (Iterator<NimPlayer> iterator = playerList.iterator(); iterator.hasNext();) { NimPlayer player = iterator.next(); if (player.getUserName().equals(userName)) { iterator.remove(); return player; // 返回被删除的玩家对象 } } return null; // 未找到匹配玩家时返回null } }
最后确认
还要确保你的NimPlayer类正确实现了getUserName方法,比如:
public String getUserName() { return userName; }
这样修改后,添加和删除玩家的功能应该就能正常运行了。
内容的提问来源于stack exchange,提问作者Woden
相关产品推荐
相关产品推荐

