You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 16:37:41