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

Java抵押贷款计算器输入非法值崩溃,如何修复实现输入重提示?

Java抵押贷款计算程序输入校验缺陷修复方案

问题根因

  • 原代码直接调用Scanner类的nextInt()、nextFloat()、nextByte()方法读取用户输入,未添加异常捕获逻辑。当用户输入非数字内容、数值超出对应数据类型取值范围时,会直接抛出InputMismatchException,导致程序直接终止运行。
  • 异常触发后,错误的输入内容会残留在Scanner的输入缓冲区中,如果不主动清理,后续的读取操作会持续读取同一段错误内容,反复触发异常。

修复方案

给每个输入读取逻辑增加异常捕获处理,同时清理缓冲区残留的错误输入,具体修改如下:

  1. 在每个输入循环中添加try-catch块捕获InputMismatchException
  2. 捕获异常后调用scanner.nextLine()清空输入缓冲区
  3. 统一输出友好提示引导用户重新输入合法值

修复后完整代码

import java.text.NumberFormat;
import java.util.InputMismatchException;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        final byte MONTHS_IN_YEAR = 12;
        final byte PERCENT = 100;
        int principal = 0;
        float monthlyInterest = 0;
        int numberOfPayments = 0;

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入1000到1000000之间的数值:");

        // 本金输入校验
        while(true) {
            System.out.print("本金:");
            try {
                principal = scanner.nextInt();
                if (principal >= 1000 && principal <= 1000_000)
                    break;
                System.out.println("请输入1000到1000000之间的有效数值");
            } catch (InputMismatchException e) {
                System.out.println("输入无效,请输入数字");
                scanner.nextLine(); // 清空缓冲区错误内容
            }
        }

        // 年利率输入校验
        while(true) {
            System.out.print("年利率:");
            try {
                float annualInterest = scanner.nextFloat();
                if (annualInterest > 0 && annualInterest <= 15) {
                    monthlyInterest = annualInterest / PERCENT / MONTHS_IN_YEAR;
                    break;
                }
                System.out.println("请输入1到15之间的有效数值");
            } catch (InputMismatchException e) {
                System.out.println("输入无效,请输入数字");
                scanner.nextLine(); // 清空缓冲区错误内容
            }
        }

        // 贷款年限输入校验
        while(true) {
            System.out.print("贷款年限(年):");
            try {
                byte years = scanner.nextByte();
                if (years > 0 && years <= 30) {
                    numberOfPayments = years * MONTHS_IN_YEAR;
                    break;
                }
                System.out.println("请输入1到30之间的有效数值");
            } catch (InputMismatchException e) {
                System.out.println("输入无效,请输入数字");
                scanner.nextLine(); // 清空缓冲区错误内容
            }
        }

        double mortgage = principal * (monthlyInterest * Math.pow(1 + monthlyInterest, numberOfPayments))
                / (Math.pow(1 + monthlyInterest, numberOfPayments) - 1);

        String mortgageFormatted = NumberFormat.getCurrencyInstance().format(mortgage);
        System.out.println("月供金额:" + mortgageFormatted);
    }
}

验证效果

  • 输入非数字内容(如abc、中文等):程序不会崩溃,会输出「输入无效,请输入数字」的提示,引导用户重新输入
  • 输入超出数据类型范围/业务规则范围的数值:程序会输出对应范围提示,引导用户重新输入,不会抛出异常终止

内容的提问来源于stack exchange,提问作者Arul Dilip

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:36:06