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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 01:03:36