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

Java开发Connect4游戏时Scanner抛出NoSuchElementError问题求助

问题分析与解决

报错原因

  • Scanner重复创建与关闭导致输入流失效:每次循环都新建Scanner实例并调用scan.close(),关闭Scanner会连带关闭底层的System.in输入流,后续再创建Scanner时,输入流已关闭,无法读取用户输入,从而抛出NoSuchElementException。即便注释掉scan.close(),多次创建Scanner实例也会导致输入流状态异常,引发错误。
  • 循环终止条件逻辑错误:原代码while(checkPlayerWin()== false|| checkAIWin()== false)的逻辑是“只要玩家没赢或者AI没赢就继续循环”,这意味着哪怕一方已经获胜,游戏仍会继续运行,甚至在胜负已分后还要求用户输入,进一步触发异常。

修复方案

1. 调整Scanner的创建与关闭时机

将Scanner实例的创建移到循环外部,仅初始化一次,循环结束后再关闭,避免多次创建/关闭导致System.in流失效。

2. 修正循环终止条件

将逻辑运算符||改为&&,即当玩家没赢且AI没赢时才继续游戏,只要任意一方获胜就终止循环。

修复后的代码

public void start() {
    // 仅创建一次Scanner实例
    Scanner scan = new Scanner(System.in);
    // 修正循环条件:双方均未获胜时继续游戏
    while(checkPlayerWin() == false && checkAIWin() == false){
        System.out.print("Pick a row ");
        int row = scan.nextInt();
        insertCounter(row, "X");
        reprintBoard();
        random();// 为AI随机落子
        reprintBoard();
    }
    // 循环结束后统一关闭Scanner
    scan.close();
}

额外优化建议

  • 确保checkPlayerWin()和checkAIWin()方法能准确判断胜负,返回true代表对应方获胜。
  • 可添加输入合法性校验,比如用scan.hasNextInt()判断用户输入是否为整数,避免因输入非整数导致InputMismatchException,示例如下:
System.out.print("Pick a row ");
while(!scan.hasNextInt()){
    System.out.println("请输入有效的行数!");
    scan.next(); // 丢弃无效输入
}
int row = scan.nextInt();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:27:51