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

如何让程序在用户输入字符串而非double时不崩溃并提示输入数字?

嘿,这个问题我之前写Java作业的时候也踩过坑!你的代码现在的问题是,一旦用户输入非数字内容,nextDouble()会直接抛出InputMismatchException,导致程序直接崩溃。另外还有个小细节可以优化:你不需要在每次循环里都新建Scanner实例,只需要在方法开头创建一次就够啦,不然会浪费资源。

下面给你两种实用的解决方案,你可以根据需求选:

方案1:主动判断输入合法性(推荐)

用Scanner的hasNextDouble()方法提前检查输入是否是有效的数字,这样能避免异常抛出,更高效:

import java.util.Scanner;

public static double[] getScores() {
    int numScores = 8;
    double[] scores = new double[numScores];
    // 只初始化一次Scanner
    Scanner ip = new Scanner(System.in);
    
    for (int a = 0; a < numScores; ) { // 这里先不自动递增索引
        System.out.println("Enter a score:");
        if (ip.hasNextDouble()) {
            // 输入是合法数字,读取并移动索引
            scores[a] = ip.nextDouble();
            a++;
        } else {
            System.out.println("抱歉,请输入有效的数字哦!");
            // 必须把无效的输入内容"吃掉",不然会一直循环读取这个无效值
            ip.next();
        }
    }
    ip.close(); // 用完记得关闭Scanner释放资源
    return scores;
}

方案2:捕获异常处理

如果更习惯用异常处理的思路,也可以通过捕获InputMismatchException来处理非法输入:

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

public static double[] getScores() {
    int numScores = 8;
    double[] scores = new double[numScores];
    Scanner ip = new Scanner(System.in);
    
    for (int a = 0; a < numScores; ) {
        System.out.println("Enter a score:");
        try {
            scores[a] = ip.nextDouble();
            a++; // 只有输入正确时才递增索引
        } catch (InputMismatchException e) {
            System.out.println("哎呀,你输入的不是数字,请重新输入!");
            ip.next(); // 同样要消费掉无效输入,避免死循环
        }
    }
    ip.close();
    return scores;
}

小提醒

不管用哪种方法,都要记得调用ip.next()处理无效输入,不然Scanner会一直停在那个非法输入上,导致循环无限执行哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:26:26