You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

抵押贷款计算器输入校验优化需求:如何实现仅接受数字输入并拦截字母输入

抵押贷款计算器输入校验优化需求:如何实现仅接受数字输入并拦截字母输入

我明白你遇到的问题了——当用户输入字母或者其他非数字内容时,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 14:18:11