Java中检测用户字符串输入错误的方法及判断条件(需输入int值)
处理Java中int输入的错误检测问题
嘿,这个场景我天天碰到——先给你点破现有代码的两个关键问题:
- 你现在只判断了数值范围,但如果用户输入
abc这类非数字字符串,input.nextInt()直接会抛出InputMismatchException,程序直接崩掉,根本走不到你的条件判断里。 - 你的范围判断逻辑写错了:
(characterNum < 0)&&(characterNum > 12)这个条件永远为false,一个数不可能同时小于0又大于12,得用逻辑或||才对!
正确的检测方式:用Scanner.hasNextInt()做前置验证
Scanner自带的hasNextInt()方法是专门干这个的——它会先检查输入缓冲区里的下一个内容是不是有效的int类型,不会强制读取输入,完美避免异常。
下面是修改后的完整代码,我给你加了注释:
Scanner input = new Scanner(System.in); int characterNum; do { // 第一步:先检测输入是否是合法的int if (!input.hasNextInt()) { System.out.println("Invalid Input: Not a number, Try again"); input.next(); // 必须吃掉这个无效的字符串,不然会一直循环读它 continue; // 跳过后面的范围判断,重新进入循环 } // 到这里说明输入是合法int,读进来 characterNum = input.nextInt(); // 第二步:判断数值范围是否符合要求 if (characterNum < 0 || characterNum > 12) { System.out.println("Invalid Input: Out of range (0-12), Try again"); } } while (characterNum < 0 || characterNum > 12); // 循环条件改成|| // 处理正确输入的逻辑 System.out.println("Valid input received: " + characterNum);
几个必须注意的细节
- 为什么要调用
input.next()? 如果用户输入了非int内容,这个无效的字符串会留在Scanner的输入缓冲区里。如果不手动清除,下一次hasNextInt()还是会读到它,程序会陷入无限循环,一直提示错误。 - 为什么优先用
hasNextInt()而不是try-catch? 异常处理一般是用来处理意外情况的,而用户输入非数字是预期内的场景,用前置检测的代码更清晰,也更符合“预防错误优于捕获错误”的编程原则。
可选方案:用try-catch捕获异常(不推荐,但可以了解)
如果你非要用异常处理的方式,也可以这么写,但代码可读性不如上面的方案:
Scanner input = new Scanner(System.in); int characterNum = -1; do { try { characterNum = input.nextInt(); if (characterNum < 0 || characterNum > 12) { System.out.println("Invalid Input: Out of range (0-12), Try again"); } } catch (InputMismatchException e) { System.out.println("Invalid Input: Not a number, Try again"); input.next(); // 同样要清除无效输入 } } while (characterNum < 0 || characterNum > 12);
内容的提问来源于stack exchange,提问作者sk3ptic
相关产品推荐
相关产品推荐

