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

Java使用ObjectInputStream读序列化文件仅输出首对象,EOF捕获报错如何解决

核心问题说明
  1. 现有读取方法每次调用仅打开一次文件流、读取1个对象就关闭流,自然只能拿到第一个序列化对象
  2. 异常捕获顺序错误:EOFException是IOException的子类,若你先捕获父类IOException,子类EOFException的捕获块永远不会被触发,IDE就会抛出「不可达catch块」的提示
实现方案(基于EOF终止循环)

你可以直接在读取循环内部捕获EOFException作为读取终止的标识,方法返回存储所有对象的集合即可,参考实现如下:

1. 修改序列化读取方法

import java.util.ArrayList;
import java.util.List;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public static List<AccountSerializable> serializReadObject() throws ClassNotFoundException, IOException {
    List<AccountSerializable> accountList = new ArrayList<>();
    // try-with-resources语法会自动关闭流,无需手动调用close()
    try (ObjectInputStream input = new ObjectInputStream(new FileInputStream("accounts.ser"))) {
        while (true) {
            try {
                AccountSerializable obj = (AccountSerializable) input.readObject();
                accountList.add(obj);
            } catch (EOFException e) {
                // 读到文件末尾,跳出读取循环
                break;
            }
        }
    }
    return accountList;
}

2. 修改main方法遍历打印所有对象

public static void main(String[] args) {
    try {
        List<AccountSerializable> accounts = serializReadObject();
        for (AccountSerializable account : accounts) {
            System.out.println(account);
        }
    } catch (ClassNotFoundException | IOException e) {
        System.out.println("读取序列化文件出错");
        e.printStackTrace();
    }
}
说明

ObjectInputStream的readObject()方法在读取到文件末尾没有更多对象时,会主动抛出EOFException,我们在循环内部单独捕获该异常终止读取即可,外层不需要额外捕获EOFException,也就不会出现之前的不可达catch块报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:45:04