Java抵押贷款计算器输入非法值崩溃,如何修复实现输入重提示?
Java抵押贷款计算程序输入校验缺陷修复方案
问题根因
- 原代码直接调用
Scanner类的nextInt()、nextFloat()、nextByte()方法读取用户输入,未添加异常捕获逻辑。当用户输入非数字内容、数值超出对应数据类型取值范围时,会直接抛出InputMismatchException,导致程序直接终止运行。 - 异常触发后,错误的输入内容会残留在Scanner的输入缓冲区中,如果不主动清理,后续的读取操作会持续读取同一段错误内容,反复触发异常。
修复方案
给每个输入读取逻辑增加异常捕获处理,同时清理缓冲区残留的错误输入,具体修改如下:
- 在每个输入循环中添加
try-catch块捕获InputMismatchException - 捕获异常后调用
scanner.nextLine()清空输入缓冲区 - 统一输出友好提示引导用户重新输入合法值
修复后完整代码
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
相关产品推荐
相关产品推荐

