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

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);

原因分析

核心差异在于两种解析方式的逻辑依赖:

  1. Scanner.nextBigDecimal():依赖JRE的**默认区域设置(Locale)**识别小数分隔符。升级后的环境默认Locale可能被设置为使用逗号(,)作为小数分隔符的区域(如Locale.GERMANY、Locale.FRANCE等),此时输入点号(.)会被判定为无效分隔符,导致解析失败抛出异常;整数无分隔符,因此不受影响。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 06:02:36