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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:37:28