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

Java文本类游戏重置异常:重启时无法正常获取玩家名称

问题分析与解决

问题现象

游戏首次启动时,可正常询问玩家名称,输入后显示早上好,[玩家名称]!并进入YourRoom逻辑;但死亡重启时,会直接跳过名称输入步骤,显示早上好,!后进入YourRoom,玩家名称为空。

核心原因

问题出在Scanner输入缓冲区的残留换行符:

  • 死亡重启代码中使用scn.nextInt()读取玩家的整数选择,该方法仅读取数字字符,不会处理输入数字后用户按下的换行符(\n),这个换行符会留在输入缓冲区中。
  • 重启调用Preparation()方法时,scn.nextLine()会直接读取缓冲区中残留的换行符,导致playerName被赋值为空字符串,从而出现跳过输入的现象。
  • 代码中出现的enterScanner.nextLine()如果是与scn不同的Scanner实例,也会加剧缓冲区处理混乱的问题。

解决方案

方案1:清理Scanner缓冲区

统一使用同一个Scanner对象,在nextInt()后立即清理残留的换行符:

System.out.println("选项1 : 选择此选项会死亡");
choice = scn.nextInt();
// 清理nextInt()留下的换行符
scn.nextLine();
if (choice == 1) {
    Points = 0;
    System.out.println("你已经死亡,请输入任意内容重启");
    scn.nextLine();
    Preparation();
}

方案2:确保获取有效玩家名称

在Preparation()方法中增加非空判断,强制玩家输入有效名称,避免空值:

public void Preparation() {
    String playerName;
    do {
        System.out.println("请输入你的名字:");
        playerName = scn.nextLine().trim();
        if (playerName.isEmpty()) {
            System.out.println("名字不能为空,请重新输入!");
        }
    } while (playerName.isEmpty());
    System.out.println("\n早上好," + playerName + "!");
    YourRoom();
}

补充说明

  • 全程使用同一个Scanner实例,避免多个Scanner同时读取输入流导致的缓冲区异常。
  • trim()方法用于去除玩家输入前后的空格,避免误输入空格导致的空值问题。

内容的提问来源于stack exchange,提问作者ema

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 09:16:20