这是一种从包含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());
}
}
答案 0 :(得分:3)
因为你已到达文件的末尾。
您似乎认为readObject()在文件末尾返回null。它没有。当且仅当您写入null时,它才返回null。
正确的测试是捕获EOFException并中断,直到readObject()返回null才读取。
答案 1 :(得分:2)
EJP是正确的,发生错误是因为当文件中没有Show时,方法readObject()
不会返回NULL。
EJP也建议了一个解决方案。我只是想建议其他几个解决方案,但解决方案不是修复读取文件的代码,而是修复编写文件的代码。
目前,该文件是通过多次调用writeObject()
方法生成的,每个方法都有一个Show
对象。您可以:
创建一个包含节目的List
对象。将此List
写入文件。阅读此文件后,您只需阅读List
即可。您不必使用while循环,因此,请避免EOF异常检查。
首先将节目数写入文件。之后,将节目逐个写入文件。阅读文件时,您需要先阅读节目数,通知您要从文件中读取多少节目。这将避免EOF异常检查。