抵押贷款计算器输入校验优化需求:如何实现仅接受数字输入并拦截字母输入
抵押贷款计算器输入校验优化需求:如何实现仅接受数字输入并拦截字母输入
我明白你遇到的问题了——当用户输入字母或者其他非数字内容时,scanner.nextInt()会直接抛出InputMismatchException异常,导致程序崩溃,而不是友好提示用户重新输入数字。下面给你两种实用的解决方案,帮你完善这个抵押贷款计算器的输入校验逻辑:
方法一:先判断输入是否为整数(推荐)
使用Scanner的hasNextInt()方法提前检查输入是否是合法整数,这样可以避免异常抛出,逻辑更清晰:
import java.util.Scanner; public class MortgageCalculator { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int principal = 0; System.out.print("Enter Principal Amount (1k to 1m): "); while (true) { // 先判断输入是否是整数 if (scanner.hasNextInt()) { principal = scanner.nextInt(); // 检查金额范围是否符合要求 if (principal >= 1000 && principal <= 1_000_000) { break; // 符合要求,退出循环 } else { System.out.println("Enter a value between 1k - 1m: "); } } else { // 输入不是整数,提示用户并清除缓冲区的无效内容 System.out.println("Please enter numbers only - letters are invalid!"); scanner.next(); // 读取并丢弃无效输入,避免死循环 } } scanner.close(); // 后续可以继续处理principal的逻辑 System.out.println("Valid principal amount: " + principal); } }
关键说明:
scanner.hasNextInt()会检查输入缓冲区的下一个 token 是否是整数,不会抛出异常- 当输入无效时,必须用
scanner.next()把缓冲区里的非数字内容读掉,否则这些内容会一直留在缓冲区,导致循环无限触发else分支
方法二:捕获输入不匹配异常
如果你更习惯用异常处理的方式,也可以捕获InputMismatchException来处理非数字输入,同样需要注意清除无效输入:
import java.util.InputMismatchException; import java.util.Scanner; public class MortgageCalculator { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int principal = 0; System.out.print("Enter Principal Amount (1k to 1m): "); while (true) { try { principal = scanner.nextInt(); // 检查金额范围 if (principal >= 1000 && principal <= 1_000_000) { break; } else { System.out.println("Enter a value between 1k - 1m: "); } } catch (InputMismatchException e) { // 捕获非数字输入的异常,提示用户 System.out.println("Please enter numbers only - letters are invalid!"); scanner.next(); // 清除缓冲区的无效内容 } } scanner.close(); System.out.println("Valid principal amount: " + principal); } }
关键说明:
- 当用户输入非数字时,
scanner.nextInt()会抛出InputMismatchException,我们在catch块里处理这个异常,给出友好提示 - 同样必须调用
scanner.next()清除无效输入,否则会进入死循环
两种方法都能解决你的问题,推荐用第一种方法,因为它更符合“预防式”编程的思路,避免不必要的异常抛出。
备注:内容来源于stack exchange,提问作者sartep
相关产品推荐
相关产品推荐

