如何验证Scanner输入,仅允许非负double值存入数组?
解决方案
你之前报错的原因很明确:hasNextDouble()只是判断下一个输入是否为double类型,并没有读取实际的数值,直接用<操作符判断大小当然会报错。下面给你两种可行的实现方式,按需选择:
方式一:直接在现有循环内修改(简便快速)
不需要额外写方法,直接在输入逻辑里加入非负检查,把整个输入验证放在一个循环里,直到用户输入符合要求为止:
import java.util.Scanner; public class ArrayReview { public static void main(String[] args){ double[] doublesArray = createArray(); printArray(doublesArray); } // 创建存储10个非负double的数组 public static double[] createArray() { Scanner userInput = new Scanner(System.in); double[] array = new double[10]; System.out.println("请输入10个非负小数"); for(int i = 0 ; i < array.length ; i++) { double inputVal; // 循环直到输入有效(是double且非负) while(true) { if(!userInput.hasNextDouble()) { userInput.nextLine(); // 丢弃无效输入 System.out.println("请输入有效的小数"); } else { inputVal = userInput.nextDouble(); if(inputVal >= 0) { break; // 符合条件,退出循环 } else { System.out.println("请输入非负的小数"); } } } array[i] = inputVal; } userInput.close(); return array; } // 打印double数组所有元素 public static void printArray(double[] array) { for(int i = 0 ; i < array.length ; i++) { System.out.print(array[i] + " "); } } }
方式二:单独编写验证方法(利于复用)
如果你的项目里有多处需要获取非负double输入,单独写一个可复用的验证方法会让代码更清晰、易维护:
import java.util.Scanner; public class ArrayReview { public static void main(String[] args){ double[] doublesArray = createArray(); printArray(doublesArray); } // 创建存储10个非负double的数组 public static double[] createArray() { Scanner userInput = new Scanner(System.in); double[] array = new double[10]; System.out.println("请输入10个非负小数"); for(int i = 0 ; i < array.length ; i++) { // 调用复用方法获取符合要求的输入 array[i] = getNonNegativeDouble(userInput, "请输入第" + (i+1) + "个非负小数"); } userInput.close(); return array; } // 通用方法:获取非负double输入 public static double getNonNegativeDouble(Scanner scanner, String prompt) { double value; while(true) { System.out.println(prompt); if(!scanner.hasNextDouble()) { scanner.nextLine(); // 丢弃无效输入 System.out.println("请输入有效的小数"); } else { value = scanner.nextDouble(); if(value >= 0) { return value; } else { System.out.println("请输入非负的小数"); } } } } // 打印double数组所有元素 public static void printArray(double[] array) { for(int i = 0 ; i < array.length ; i++) { System.out.print(array[i] + " "); } } }
选择建议
- 如果只是当前这个方法需要非负验证,用方式一更直接,不用额外拆方法;
- 如果后续有多处类似输入需求,方式二的复用性更强,代码结构也更清晰。
内容的提问来源于stack exchange,提问作者Levy Ocampo
相关产品推荐
相关产品推荐

