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

