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

Scanner置于Java while循环外引发输入异常的问题排查

问题原因分析

当你输入非数字字符串时,Scanner.nextInt()会读取失败并抛出异常,但无效的输入内容会留在输入缓冲区里。接下来每次循环调用nextInt()时,都会直接读取到这个残留的无效输入,再次抛出异常,进入catch块后又直接continue,导致无限循环输出错误信息和选项。

另外,你尝试关闭Scanner的操作完全没必要——System.in是全局输入流,一旦关闭整个程序都没法再读取输入了,而且这里Scanner是静态全局的,关闭后后续代码也无法使用。

修复后的代码
import java.util.Scanner;

public class Metods {

    static Scanner input = new Scanner(System.in);

    public static int Start() {
        while(true) {
            
            int choice;
    
            System.out.println("1 - New game");
            System.out.println("2 - Load game");
            System.out.print("\nChoose an option");
    
            try {
                choice = input.nextInt();
            } catch (Exception e) {
                System.out.println("Error");
                // 关键:清空缓冲区里的无效输入
                input.nextLine();
                continue;
            }

            if (choice == 1 || choice == 2) {
                return choice;
            }
            else {
                System.out.println("Error");
            }
        }
    }
}
关键说明
  • 在catch块里添加input.nextLine():把缓冲区里残留的非数字输入(包括换行符)全部读取并丢弃,这样下一次循环调用nextInt()时,就能等待用户输入新的内容。
  • 不要随意关闭Scanner:除非你确定整个程序都不再需要读取输入,否则关闭System.in关联的Scanner会导致后续输入操作失败。
  • 把Scanner放在循环内每次新建能解决问题的原因:每次新建Scanner都会重新绑定System.in,相当于每次都重置了输入缓冲区,自然不会有残留输入的问题,但这种方式不如复用静态Scanner高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 04:32:32