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

