Java Scanner nextBigDecimal()抛出InputMismatchException异常排查
Scanner.nextBigDecimal() 处理小数输入时抛出 InputMismatchException 的原因分析
问题背景
此前使用Scanner.nextBigDecimal()读取控制台输入的期初余额(含整数、小数)一切正常,升级到Eclipse 2023-12版本并切换至Azul Zulu JRE 1.8后,输入整数(如0、9、100)程序运行正常,但输入小数(如0.00、99.01)会抛出java.util.InputMismatchException。尝试过setScale()、修改小数分隔符为逗号、调用Scanner.reset()均无效。
异常触发代码
System.out.print("Enter opening balance (Use . for decimal.): "); BigDecimal checkBalSign = scan.nextBigDecimal();
异常堆栈信息
Exception in thread "main" java.util.InputMismatchException at java.base/java.util.Scanner.throwFor(Scanner.java:939) at java.base/java.util.Scanner.next(Scanner.java:1594) at java.base/java.util.Scanner.nextBigDecimal(Scanner.java:2740) at standardbank.TonyDen.Toolbox.MT940_Formatter.initialSetup(MT940_Formatter.java:137)
已验证的解决方法
通过先读取字符串再转换为BigDecimal的方式规避异常:
String decimalInput = scan.next(); BigDecimal checkBalSign = new BigDecimal(decimalInput);
原因分析
核心差异在于两种解析方式的逻辑依赖:
- Scanner.nextBigDecimal():依赖JRE的**默认区域设置(Locale)**识别小数分隔符。升级后的环境默认Locale可能被设置为使用逗号(,)作为小数分隔符的区域(如Locale.GERMANY、Locale.FRANCE等),此时输入点号(.)会被判定为无效分隔符,导致解析失败抛出异常;整数无分隔符,因此不受影响。
- new BigDecimal(String):直接按纯字符串格式解析,不依赖系统Locale,只要输入符合BigDecimal的字符串格式要求(点号作为小数分隔符)就能正常转换。
额外验证/修复方案
- 查看当前默认Locale:
System.out.println(Locale.getDefault()); - 显式为Scanner指定兼容点号的Locale(如Locale.US),恢复
nextBigDecimal()的正常功能:Scanner scan = new Scanner(System.in).useLocale(Locale.US);
内容的提问来源于stack exchange,提问作者GuzziTony
相关产品推荐
相关产品推荐

