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
相关产品推荐
相关产品推荐

