Java使用Scanner读取字段数不一致文件 将id3存入ArrayList的问题
问题原因分析
- 核心逻辑错误:读取完第一个id3后直接调用
inputFile.nextLine()跳过了当前行剩余的所有内容,导致该行后续的多个id3都没有被读取 - 其他需要修正的问题:
- Scanner初始化错误:
new Scanner ("myFile")传入的是字符串常量而非你创建的File对象,实际不会读取目标文件,需改为new Scanner(myFile) - 变量名不匹配:你定义的id3集合变量名为
id3List,代码中调用add方法时写的是id3.add - 方法调用语法错误:
hasNextInt是Scanner的类方法,需要加括号写成hasNextInt() - 空值未兼容:第三行的price字段为空,直接调用
nextFloat()会触发InputMismatchException - 代码结构错误:while循环、内层try块均缺少闭合大括号
- Scanner初始化错误:
修复后代码
import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.InputMismatchException; import java.util.Scanner; public class ReadFile { public static void main(String[] args){ //变量定义 int id1; int id2; String date; float price; ArrayList<Integer> id3List = new ArrayList<>(); try { File myFile = new File("fileName.txt"); Scanner inputFile = new Scanner(myFile).useDelimiter(",|\\r|\\n"); try { while (inputFile.hasNext()) { //读取前三个固定字段 id1 = inputFile.nextInt(); id2 = inputFile.nextInt(); date = inputFile.next(); //处理空price字段 String priceStr = inputFile.next().trim(); if(priceStr.isEmpty()){ price = 0f; //空值可按需求设置默认值 }else{ price = Float.parseFloat(priceStr); } //循环读取当前行所有剩余的id3值 while(inputFile.hasNextInt()){ id3List.add(inputFile.nextInt()); } //消费当前行剩余内容,跳到下一行 if(inputFile.hasNextLine()){ inputFile.nextLine(); } } } catch(InputMismatchException | NumberFormatException e){ System.out.println("Bad data in file."); } System.out.println(id3List); inputFile.close(); } catch(FileNotFoundException e) { System.out.println("The file was not found."); } } }
运行结果
[8271, 3715, 7362, 837, 3545, 7645, 460]
内容的提问来源于stack exchange,提问作者Rock
相关产品推荐
相关产品推荐

