Java读取混合整数与浮点数文件分类存储到ArrayList报错问题
问题根因
你的代码逻辑存在本质错误:
- 你写死了「读1个整数→读1个双精度浮点数」的交替读取逻辑,但实际文件数据并不是整数、浮点数交替排列:样例每行前7个值都是整数,后6个值才是浮点数,连续读取多个整数时,你强制调用
nextDouble()会把整数读成浮点值,后续碰到浮点数时又调用nextInt(),直接触发InputMismatchException。 - 代码里的
instanceof判断完全无效:nextInt()返回值本身就是Integer类型,nextDouble()返回值本身就是Double类型,不存在类型判断的作用。
可行实现方案
不需要固定读取顺序,遍历文件中所有被空白符(空格、制表符、换行)分隔的数值,逐个判断类型后存入对应列表即可,两种常用实现如下:
方案1:基于Scanner的token遍历(最简便)
Scanner默认会把所有空白符作为分隔符拆分内容,不需要手动处理换行、多空格、制表符,逐token判断类型即可:
import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Scanner; public class Test { public static void main(String[] args) { ArrayList<Integer> integerArrayList = new ArrayList<>(); ArrayList<Double> doubleArrayList = new ArrayList<>(); String filePath = "records.txt"; // 用try-with-resources自动关闭流,避免资源泄漏 try (Scanner input = new Scanner(new File(filePath))) { while (input.hasNext()) { if (input.hasNextInt()) { // 当前token是整数,存入整数列表 integerArrayList.add(input.nextInt()); } else { // 非整数值按双精度浮点数读取 doubleArrayList.add(input.nextDouble()); } } System.out.println("整数集合内容:" + integerArrayList); System.out.println("浮点数集合内容:" + doubleArrayList); } catch (IOException e) { e.printStackTrace(); } } }
方案2:逐行读取后分割处理
如果需要保留行级处理逻辑,可以每次读取一整行,拆分后逐个处理每个数值片段:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; public class Test { public static void main(String[] args) { ArrayList<Integer> integerArrayList = new ArrayList<>(); ArrayList<Double> doubleArrayList = new ArrayList<>(); String filePath = "records.txt"; try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { String line; while ((line = reader.readLine()) != null) { // 按任意长度空白符切分,跳过空内容 String[] valueParts = line.trim().split("\\s+"); for (String part : valueParts) { if (part.contains(".")) { doubleArrayList.add(Double.parseDouble(part)); } else { integerArrayList.add(Integer.parseInt(part)); } } } System.out.println("整数集合内容:" + integerArrayList); System.out.println("浮点数集合内容:" + doubleArrayList); } catch (IOException e) { e.printStackTrace(); } } }
注意点
- 你的文件里列分隔用的是制表符+多空格,上述两种方案都可以自动适配,不需要手动处理分隔符差异
- 不要使用原生类型的ArrayList(即
new ArrayList()没有指定泛型参数),要写完整泛型声明new ArrayList<>(),避免类型安全警告 - 所有文件流都建议用try-with-resources语法自动关闭,不需要手动写close逻辑
内容的提问来源于stack exchange,提问作者moutasim omran
相关产品推荐
相关产品推荐

