当前位置: 首页 > 知识库问答 >
问题:

Java EOFException问题ObjectInputStream

艾意蕴
2023-03-14

我正在尝试实现一个“帐户”列表的加载/保存,其方法与我成功使用的一个HashMap类似。

背景:

private List<Account> accounts;

public AccountManager() {
    try {
        accounts = LoadSave.loadAccounts();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

在这里我想设置我的帐户列表包括保存的帐户。

加载/保存实现:

public static void saveAccounts(List<Account> accounts) throws IOException {
    try {
        FileOutputStream fos = new FileOutputStream("accounts.ser");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(accounts);
        oos.close();
        fos.close();
        System.out.printf("Saved account.");
    }
    catch(IOException ioe) {
        ioe.printStackTrace();
    }
}

public static List<Account> loadAccounts() throws IOException {
    List<Account> accounts = null;
    try {
        FileInputStream fis = new FileInputStream("accounts.ser");
        ObjectInputStream ois = new ObjectInputStream(fis);
        accounts = (List<Account>) ois.readObject();
        ois.close();
        fis.close();
    }
    catch(IOException ioe) {
        ioe.printStackTrace();
    }
    catch(ClassNotFoundException c) {
        System.out.println("Class not found");
        c.printStackTrace();
    }

    return accounts;
}

问题是,当我第一次初始化AccountManager时,accounts.ser文件没有保存的帐户,因为该功能是在稍后的方法中实现的,因此给出了以下例外情况:

我尝试在捕获EOFExceptions时将account设置为新的ArrayList,但它仍然抛出EOFException。我希望能够在打开accounts manager窗口时加载帐户,因此我需要能够在构造函数中加载帐户。

共有1个答案

花永昌
2023-03-14

能够在填充文件时加载帐户或使用以下代码将帐户设置为空的ArrayList:

public static List<Account> loadAccounts() throws IOException {
    List<Account> accounts = null;
    try {
        File file = new File("accounts.ser");
        if (file.length() == 0) {
            accounts = new ArrayList<>();
        } else {
            FileInputStream fis = new FileInputStream("accounts.ser");
            ObjectInputStream ois = new ObjectInputStream(fis);
            accounts = (List<Account>) ois.readObject();
            ois.close();
            fis.close();
        }
    }
    catch(IOException ioe) {
        ioe.printStackTrace();
    }
    catch(ClassNotFoundException c) {
        System.out.println("Class not found");
        c.printStackTrace();
    }
    return accounts;
}

我只需要简单地检查文件的长度,如果它不为零,则返回对象,如果它为零,则返回一个空的ArrayList。

 类似资料:
  • 问题内容: 包括: all Spring libs, Apache Tomcat 7.0 library 在构建路径中 但它仍然给出错误: 在“ org.sprintframework.web-3.1.0.M1.jar”中,我可以看到“ org.springframework.web.context.ContextLoaderListener”。 Google上的某个人说应该包含spring.ja

  • 发布问题 更新问题 设置问题悬赏 获取问题列表 获取一个问题详情 删除一个问题 获取用户发布的问题列表 发布问题 POST /questions 输入 字段 类型 描述 subject 字符串 必须,问题主题或者说标题,不能超过 255 字节 ,必须以 ? 结尾。(不区分全角或者半角) topics 数组 必须,绑定的话题,数组子节点必须符合 { "id": 1 } 的格式。 body 字符串

  • 问题内容: 我使用非常简单的代码返回XML 但是,出现以下错误 请帮忙。谢谢 问题答案: 运行时出现NoSuchMethodError表示你使用的库版本与生成代码所针对的版本不同。 在你的情况下,Spring是元凶。在运行时检查类路径上的内容,并确保以下各项: 版本与编译时间罐相同 如果存在多个版本,请删除不需要的版本

  • 主要内容:什么是安全函数(safe function),如何取消安全函数的限制在 VS(Visual Studio)下编译C语言程序,如果使用了 scanf()、gets()、strcpy()、strcat() 等与字符串读取或操作有关的函数,有时候VS会报错,提示该函数可能不安全,并且建议替换为带有 后缀的安全函数,如下图所示: 什么是安全函数(safe function) scanf()、gets()、fgets()、strcpy()、strcat() 等都是C语言自带

  • 主要内容:前言,粘包,拆包前言 粘包问题:一个请求里面带有多个响应,多个消息粘再一起给你发送回来; 拆包问题:一个消息拆成多个请求发送回来; 粘包 其中 一直递归调用,最终处理粘包问题核心代码 拆包 50生产者|60如何处理 有两种地方可能会发生拆包: 消息体的size 消息体 1. 消息体的size 2. 消息体

  • 问题内容: 我试图在Spring Example上发布并运行简单的Spring应用程序。 我正进入(状态 我已经安装了spring.jar,spring-webmvc.jar和所有其他所需的jar,因此不确定为什么会收到此错误。 这是我的web.xml文件 和我的Spring-servlet.xml文件 我不确定这里出了什么问题,将不胜感激。我已经遍历了springsource论坛和有关SO的其他

  • 问题内容: 我有两个值,和: 和ArrayList: 假设我将的敌人中的三个和五个添加到。每当我想更改数组内的变量时,例如: __数组中的 每个都 被更改,而不仅仅是index处的一个。 问题答案: 您每次将3个对 同一个 smallRed敌人的引用添加到arraylist。 解释; 可以被认为是一个内存地址(尽管比它复杂得多),因此您要多次添加相同的内存地址(例如,将相同的房屋地址添加到现实生活

  • 问题内容: 我有一个简单的数组: 当我使用json_encode()对数组进行编码时,我得到以下信息: 我的问题是,获得 替代的原因是什么? 问题答案: “ {}”括号指定一个对象,“ []”用于根据JSON规范的数组。从内存分配的角度来看,数组没有枚举。只是数据后面跟随着更多的数据,另一方面,对象具有带有名称的属性,并且数据已分配给这些属性,因此,要对此类对象进行编码,还必须传递正确的属性名称。