为什么我得到java.io.EOFException?

时间:2014-06-20 13:33:36

标签: java exception eof

这是一种从包含Show类型的序列化对象的.ser文件中读取显示详细信息的方法。该方法成功返回列表,但之前给出了Exception。为什么会如此?如何摆脱它呢?

public List<Show> populateDataFromFile(String fileName) {
        List<Show> shows=new ArrayList<Show>();
        ObjectInputStream obj=null;
    try {
        FileInputStream fin=new FileInputStream(fileName);
        obj=new ObjectInputStream(fin);
        Show show=null;
        while((show=(Show) obj.readObject())!=null)
        {
            shows.add(show);
            show.getShowName();
        }
        System.out.println(shows);
    } catch (IOException e) {
        e.printStackTrace();
    }catch(ClassNotFoundException e)
    {
        e.printStackTrace();
    }finally
    {
        try {
            obj.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    return shows;
}

输出

java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2571)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1315)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
at com.util.DataManagerImpl.populateDataFromFile(DataManagerImpl.java:23)
at com.psl.Client.main(Client.java:9)
Show Name: Sahi re Sahi
Show Time: 6:30 PM
Seats Available: 40
Show Name: Ek Shyam Aapke Naam
Show Time: 6:30 PM
Seats Available: 40
Show Name: Moruchi Maushi
Show Time: 6:30 PM
Seats Available: 40
Show Name: All The Best
Show Time: 6:30 PM
Seats Available: 40
Show Name: Naksharanche Dene
Show Time: 6:30 PM
Seats Available: 40

主要方法是

public static void main(String[] args) {
    DataManager dm=new DataManagerImpl();
    List<Show>shows=dm.populateDataFromFile("ShowDetails.ser");
    // Call all the functionalities from here to test your code.    
    for(Show show:shows)
    {
        System.out.println("Show Name: "+show.getShowName());
        System.out.println("Show Time: "+show.getShowTime());
        System.out.println("Seats Available: "+show.getSeatsAvailable());
    }
}

2 个答案:

答案 0 :(得分:3)

因为你已到达文件的末尾。

您似乎认为readObject()在文件末尾返回null。它没有。当且仅当您写入null时,它才返回null。

正确的测试是捕获EOFException并中断,直到readObject()返回null才读取。

答案 1 :(得分:2)

EJP是正确的,发生错误是因为当文件中没有Show时,方法readObject()不会返回NULL。

EJP也建议了一个解决方案。我只是想建议其他几个解决方案,但解决方案不是修复读取文件的代码,而是修复编写文件的代码。

目前,该文件是通过多次调用writeObject()方法生成的,每个方法都有一个Show对象。您可以:

而不是这样做
  1. 创建一个包含节目的List对象。将此List写入文件。阅读此文件后,您只需阅读List即可。您不必使用while循环,因此,请避免EOF异常检查。

  2. 首先将节目数写入文件。之后,将节目逐个写入文件。阅读文件时,您需要先阅读节目数,通知您要从文件中读取多少节目。这将避免EOF异常检查。