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
相关产品推荐
相关产品推荐

