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

Java中While循环结合Try-Catch处理输入异常的问题

解决玩家选择循环的无效输入问题

我太懂你遇到的这个坑了——当用户输入非整数内容时,循环直接“卡壳”无限输出错误提示,根本不给用户重新输入的机会对吧?这是因为Scanner.nextInt()读取失败后,那些无效的输入字符还留在输入缓冲区里,下一次循环它又会重复读取这些垃圾内容,导致死循环。

下面是修复后的代码,我会一步步给你解释改动点:

import java.util.InputMismatchException;
import java.util.Scanner;

public class PlayerSelector {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int player;
        boolean playerCreated = false;

        while (!playerCreated) { // 简化写法,!playerCreated比playerCreated == false更简洁直观
            try {
                System.out.print("请选择玩家1或玩家2:");
                player = scan.nextInt();
                
                if (player != 1 && player != 2) {
                    throw new IllegalArgumentException("输入的数字不是1或2");
                }
                
                playerCreated = true;
                System.out.println("成功选择玩家" + player);
            } catch (InputMismatchException e) {
                // 关键操作:清空输入缓冲区里的无效内容
                scan.nextLine();
                System.out.println("错误:请输入有效的整数!");
            } catch (IllegalArgumentException e) {
                System.out.println("错误:" + e.getMessage());
            }
        }
        scan.close(); // 记得用完关闭Scanner释放资源
    }
}

核心改动说明:

  • 精准捕获异常:不再用笼统的Exception,而是分别捕获InputMismatchException(非整数输入时抛出)和自定义的IllegalArgumentException(数字不在1/2范围内时抛出),能更清晰地区分不同类型的错误。
  • 清空输入缓冲区:在捕获到非整数输入的异常时,调用scan.nextLine()把缓冲区里的无效字符(比如字母、符号、换行符)全部清空,这样下一次循环scan.nextInt()才能正常读取用户的新输入。
  • 优化错误提示:给用户明确的反馈,告诉他们具体哪里错了、该输入什么,提升交互体验。
  • 简化代码写法:!playerCreated是Java里更常用的布尔判断写法,读起来更顺畅。

这样修改后,不管用户输入字母、符号还是不在1-2范围内的数字,程序都能正确处理,让用户重新输入,不会再出现循环“失效”的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:57:42