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

Java中isNaN未捕获非Double类型输入 输入字母时程序停止问题求助

Java数字输入校验逻辑修复方案

你的代码存在3个核心问题

  • Scanner.nextDouble()在接收到非数字输入时会直接抛出InputMismatchException异常终止程序,不会返回NaN值。NaN是用于标识非法数值运算结果(比如0.0/0.0)的特殊值,完全不能用于判断输入格式合法性。
  • 基本数据类型double没有isNaN()成员方法,该方法是Double包装类的静态方法,正确调用格式为Double.isNaN(待判断变量)。
  • else;后的分号导致else分支为空,无论if判断结果如何,break语句都会执行,循环逻辑完全失效。

正确实现代码

import java.util.Scanner;

public class NumberValidator {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        double num1;

        while (true) {
            System.out.println("first number");
            // 先校验输入格式是否符合double要求
            if (input.hasNextDouble()) {
                num1 = input.nextDouble();
                // 可选:如果需要额外排除NaN运算结果可以加下面这段判断
                // if (Double.isNaN(num1)) {
                //     System.out.println("invalid input");
                //     input.nextLine();
                //     continue;
                // }
                break;
            } else {
                System.out.println("invalid input");
                // 清空输入缓冲区的错误内容,避免死循环
                input.nextLine();
            }
        }
        System.out.println("输入的合法数字为:" + num1);
        input.close();
    }
}

逻辑说明

  • 调用Scanner.hasNextDouble()提前判断输入格式是否匹配,从根源避免输入非数字时抛出异常
  • 输入不合法时必须调用input.nextLine()清空缓冲区残留的错误内容,否则程序会持续读取同一段错误输入进入死循环
  • 正常用户输入不会产生NaN值,仅当有特殊数值运算场景时才需要补充Double.isNaN()判断

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:24:02