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

Java异常处理引发无限循环问题求助

解决Scanner输入错误导致的无限循环问题

嘿,这个坑我刚学Java的时候也踩过!咱们先搞清楚为什么会无限循环,再动手改代码~

问题根源

当你输入非整数内容时,sc.nextInt()会抛出异常,但那个错误的输入并没有被从Scanner的缓冲区里清除掉。下次递归调用data()时,sc.nextInt()会立刻读到缓冲区里残留的无效内容,再次抛出异常,就这样无限循环下去了。

修复方案

在catch块里,先调用sc.nextLine()把缓冲区里的无效输入清空,然后再重新调用data()。这样下次读取的时候,就能获取用户新的输入了。

修改后的代码如下:

static Scanner sc; 
static double n1; 
static double n2; 
static String operation; 

static void data() { 
    try { 
        System.out.println("Enter first number"); 
        n1 = sc.nextInt(); 
        sc.nextLine(); 
        System.out.println("Enter second number"); 
        n2 = sc.nextInt(); 
        sc.nextLine(); 
        System.out.println("Enter operation you want to perform"); 
        operation = sc.nextLine(); 
    } catch(Exception e) { 
        System.err.println("Wrong data entered!! \n Please enter right data"); 
        // 清空缓冲区里的无效输入
        sc.nextLine(); 
        data(); 
    } 
}

更优雅的写法:提前检查输入(避免异常)

其实我们可以不用依赖异常捕获,而是用sc.hasNextInt()提前检查用户输入是否是整数,这样代码逻辑更清晰,也更高效:

static Scanner sc; 
static double n1; 
static double n2; 
static String operation; 

static void data() { 
    // 获取第一个数
    System.out.println("Enter first number"); 
    while(!sc.hasNextInt()) {
        System.err.println("Wrong data entered!! \n Please enter right data");
        sc.nextLine(); // 清空无效输入
    }
    n1 = sc.nextInt();
    sc.nextLine();

    // 获取第二个数
    System.out.println("Enter second number"); 
    while(!sc.hasNextInt()) {
        System.err.println("Wrong data entered!! \n Please enter right data");
        sc.nextLine(); // 清空无效输入
    }
    n2 = sc.nextInt();
    sc.nextLine();

    // 获取操作符
    System.out.println("Enter operation you want to perform"); 
    operation = sc.nextLine(); 
}

这种写法用循环代替了递归,也避免了频繁抛出异常的开销,推荐新手尝试~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:28:07