Scanner输入字母报错:需实现数字有效、非数字无效的验证逻辑
解决输入数字验证时的异常问题
看起来你遇到的核心问题有两个:一是用Scanner.nextDouble()读取非数字输入时会直接抛出异常,根本没机会执行你后面的判断逻辑;二是你写的if条件完全不成立,因为你在拿字符串和double类型的变量qty做比较,这逻辑根本走不通。
为什么会抛出异常?
当你调用nextDouble()时,Scanner会尝试把输入的内容转换成double类型,如果输入的是字母或特殊字符,转换失败就会抛出InputMismatchException,程序直接终止,不会走到后面的if判断分支。
同时你原来的判断逻辑完全错误:!("[_a-z_A-Z_)+").equals("qty")|| !("[_!_~_@_#_$]").equals("qty")是在比较两个固定字符串是否相等,和用户输入的qty变量没有任何关联,永远不会触发"wrong input"的输出。
两种可行的解决方案
方案一:捕获异常处理
通过try-catch块捕获转换失败的异常,优雅处理非数字输入:
package quantity; import java.util.Scanner; public class Quantity { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("enter input"); try { // 尝试读取并转换为double double qty = input.nextDouble(); System.out.println(" input =" + qty); System.out.println("correct format"); } catch (java.util.InputMismatchException e) { // 输入不是有效数字时执行这里 System.out.println("wrong input"); } input.close(); } }
方案二:先读字符串再验证格式
如果你想更灵活地控制输入规则,可以先读取输入为字符串,用正则表达式验证是否符合数字格式:
package quantity; import java.util.Scanner; public class Quantity { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("enter input"); // 读取完整的输入行 String inputStr = input.nextLine(); // 正则匹配整数/小数(支持正负号) if (inputStr.matches("-?\\d+(\\.\\d+)?")) { double qty = Double.parseDouble(inputStr); System.out.println(" input =" + qty); System.out.println("correct format"); } else { System.out.println("wrong input"); } input.close(); } }
解释一下正则表达式-?\\d+(\\.\\d+)?:
-?:匹配可选的负号\\d+:匹配至少一个数字(整数部分)(\\.\\d+)?:匹配可选的小数部分(小数点+至少一个数字)
内容的提问来源于stack exchange,提问作者D V
相关产品推荐
相关产品推荐

