Mac环境Eclipse中Java Scanner调用nextDouble/nextInt触发InputMismatchException问题
macOS下Scanner.nextDouble()/nextInt()抛出InputMismatchException的解决方案
兄弟,我之前踩过一模一样的跨平台坑!结合你的代码和数据来看,主要有两个核心原因导致了这个异常,给你一步步拆解解决方案:
1. 最可能的元凶:系统Locale差异
Windows和macOS的JVM默认Locale可能不一样——比如部分地区的macOS默认会用逗号作为小数分隔符,但你的数据里用的是点(比如1.1),这就直接导致Scanner把1.1当成了非数字字符串,抛出InputMismatchException。
解决方法:强制指定Scanner的Locale
显式给Scanner设置Locale.US(或者其他用点做小数分隔符的Locale),不管系统默认是什么,统一解析规则:
首先在文件顶部导入Locale:
import java.util.Locale;
然后修改readVehicleData方法里创建strScanner的代码,修正分隔符正则(你原来的正则里多了个换行符,这会导致解析异常)+ 添加Locale设置:
// 修正分隔符为逗号(前后允许空白),同时指定Locale Scanner strScanner = new Scanner(lineOfText) .useDelimiter("\\s*,\\s*") .useLocale(Locale.US);
2. 隐藏坑:model字段的读取错位
看你的数据示例,model字段是带空格的(比如Panda Active Eco),如果你的分隔符正则写错了(比如误把空白符当成了分隔符),strScanner.next()只会读到Panda,后面的Active会被错误地当成airCon的字段,导致后续所有字段的解析完全错位——最终解析engineSize时读到的是Eco这种非数字内容,自然抛出异常。
验证方法:加调试输出排查
在Vehicle.readData方法里临时加调试代码,看看每个next()实际读到的内容:
public void readData(Scanner strScanner) { group = strScanner.next(); System.out.println("Group: " + group); vehID = strScanner.next(); System.out.println("VehID: " + vehID); regNo = strScanner.next(); System.out.println("RegNo: " + regNo); make = strScanner.next(); System.out.println("Make: " + make); model = strScanner.next(); System.out.println("Model: " + model); // 这里应该输出完整的"Panda Active Eco",如果只输出"Panda"就是分隔符的问题 // ... 后续字段同理 }
额外优化建议
- 删除
readVehicleData里多余的strScanner.nextLine();:你已经用next()读完了当前行的所有token,调用nextLine()会尝试读取不存在的内容,可能引发NoSuchElementException; - 检查数据文件的换行符:Windows用
\r\n,macOS用\n,不过Scanner本身会处理这个,但如果文件有特殊换行符可能影响解析,建议用文本编辑器统一转换为LF格式; - 确认macOS系统区域设置:可以在「系统设置-语言与地区」里查看是否确实用了非点作为小数分隔符,这也能验证我们的Locale猜想。
把上面的方案结合起来,应该就能完美解决跨平台的异常问题了!
内容的提问来源于stack exchange,提问作者fqmcr
相关产品推荐
相关产品推荐

