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

Java Scanner读取文件报InputMismatchException如何解决

问题报错

运行Java程序通过Scanner读取room.txt构造Room对象时,在Main.java第35行调用nextInt()位置抛出如下异常:

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.nextInt(Scanner.java:2258)
    at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
    at Main.main(Main.java:35)
根因分析

触发这个异常有两个高频原因:

  • 读取逻辑错位:Scanner.nextInt()方法只会读取匹配整数的内容,不会消费整数后面的行尾换行符。第一次读取id后,紧接着的第一次nextLine()会直接读到id所在行剩下的空字符串,而非预期的房间描述;第二次nextLine()读到的才是描述内容。等到下一轮循环再调用nextInt()时,实际读到的是上一条记录的visited字段值(true/false字符串),不是合法整数,直接触发类型不匹配异常。
  • 文件内容/编码不匹配:如果room.txt的id位置存了非整数字符(全角数字、特殊不可见符号、UTF-8 BOM头),或者文件编码和Scanner默认使用的系统编码不一致,也会导致nextInt()无法识别到合法整数抛出异常。另外原代码只创建了Room对象,没有将对象加入对应集合,即使读取成功也不会保存数据。
修复方法

方案1:补全换行符消费逻辑

在每次调用nextInt()读取id后,额外调用一次nextLine()消费掉残留的行尾换行,修正读取偏移:

// 提前初始化存储Room的集合,比如List<Room> roomList = new ArrayList<>();
// read one value at a time
while(roomReader != null && roomReader.hasNext()){
    //assign values to attributes
    int id = roomReader.nextInt();
    roomReader.nextLine(); // 消费行尾残留换行,解决错位问题
    String desc = roomReader.nextLine();
    String visitedString = roomReader.nextLine();
    boolean visited = Boolean.parseBoolean(visitedString);
    
    //add new objects to the array list
    Room room = new Room(id, desc, visited);
    roomList.add(room); // 补全存入集合的逻辑
}
roomReader.close(); // 用完Scanner手动关闭,避免资源泄漏

方案2:全量按行读取自行转换(更稳妥)

全程使用nextLine()按整行读取内容,手动做类型转换,从根源上避免Scanner的分隔符消费坑,同时加trim()过滤首尾不可见空白字符,推荐配合try-with-resources自动管理Scanner资源:

// 需导入java.nio.charset.StandardCharsets
try(Scanner roomReader = new Scanner(roomFile, StandardCharsets.UTF_8)){
    List<Room> roomList = new ArrayList<>();
    while(roomReader.hasNextLine()){
        int id = Integer.parseInt(roomReader.nextLine().trim());
        String desc = roomReader.nextLine().trim();
        boolean visited = Boolean.parseBoolean(roomReader.nextLine().trim());
        roomList.add(new Room(id, desc, visited));
    }
} catch (FileNotFoundException e){
    System.out.println("Room.txt file has not been found");
}

修复代码的同时需要检查room.txt的格式,确保每条数据严格按照「整数id、描述文本、布尔值」三行一组的结构存储,没有多余空行,文件保存为无BOM的UTF-8格式即可。

内容的提问来源于stack exchange,提问作者senzubeanz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 18:54:32