【问题标题】:An EOFException in JavaJava 中的 EOFException
【发布时间】:2014-11-18 19:40:42
【问题描述】:

我目前正在用 JAVA 进行序列化,到目前为止,我已经使序列化和反序列化工作正常。例如,如果我在程序中制作电影,关闭程序然后重新打开程序,电影仍然存在。我的问题是,即使当我运行程序时所有代码都可以正常工作并且序列化工作正常,我也会收到如下所示的错误。

在这里你可以看到我的程序正在运行并显示异常

这是异常指向的代码

public void readRecordsFromFile()
{
    Video v = null;

    try
    {
        FileInputStream fileIn = new FileInputStream("PrintOut.dat");
        ObjectInputStream in = new ObjectInputStream(fileIn);

        while((v = (Video)in.readObject()) != null)
        {
            videos.add(v);
        }
        //videos=(ArrayList<Video>)in.readObject();

        fileIn.close();
        in.close();

    }

    catch(IOException i)
    {
        System.out.println("IO Exception");
        i.printStackTrace();
        return;
    }

    catch(ClassNotFoundException m)
    {
        System.out.println("Class Not Found Exception");
        m.printStackTrace();
        return;
    }
}

尤其是它指向的那条线

while((v = (Video)in.readObject()) !=null)

有没有办法消除异常?即使出现异常,我的程序也能正常运行这一事实让我相信它可能并不那么重要,但我认为删除异常是一种好习惯。

任何帮助将不胜感激,如果需要任何其他代码,请告诉我, 提前致谢, 杰森

【问题讨论】:

标签: java exception


【解决方案1】:

ObjectInputStream 到达缓冲区时,没有真正干净的方法来解决。

你最好的策略是在开头写一个整数来说明你要写多少个对象。然后,当你读回对象时,你首先读入这个整数;然后你从流中读取那么多对象。

【讨论】:

  • 更进一步,只要对象不占用过多的内存,他就可以读写一个Video[] 类型的数组。
【解决方案2】:

EOFException 意味着您到达了文件的末尾,并且没有什么可以真正处理的。我建议为 EOFException 添加一个新的捕获,以防止错误出现在您的控制台中。我还将 close() 调用移动到 finally 块 - 所以像这样:

public void readRecordsFromFile()
{
    Video v = null;

    try
    {
        FileInputStream fileIn = new FileInputStream("PrintOut.dat");
        ObjectInputStream in = new ObjectInputStream(fileIn);

        while((v = (Video)in.readObject()) != null)
        {
            videos.add(v);
        }
        //videos=(ArrayList<Video>)in.readObject();

    }

    catch(IOException i)
    {
        System.out.println("IO Exception");
        i.printStackTrace();
        return;
    }

    catch(ClassNotFoundException m)
    {
        System.out.println("Class Not Found Exception");
        m.printStackTrace();
        return;
    }

    catch(EOFException eofe)
    {
         // Don't print anything, we just don't want the error blowing up in the regular output.
         return;
    }

    finally
    {
        // Guarantee that the streams are closed, even if there's an error.
        fileIn.close();
        in.close();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多