java出现异常Exception in thread "main" java.io.EOFException

publicstaticvoidmain(Stringargs[])throwsException{Filef=newFile("d:"+File.separator+"... public static void main(String args[]) throws Exception{
File f=new File("d:"+File.separator+"test2.txt");
RandomAccessFile rdf=new RandomAccessFile(f,"rw");
School sch = new School("西南大学");
Student2 s1=new Student2("zhangsa",30);
Student2 S2=new Student2("mnc",30);
sch.getAllStudents().add(s1);
sch.getAllStudents().add(S2);
Iterator<Student2> iter=sch.getAllStudents().iterator();
ObjectOutputStream oos= null ;
oos = new ObjectOutputStream(new FileOutputStream(f)) ;
while(iter.hasNext()){
Student2 a5=iter.next();
oos.writeObject(a5) ;
}
Object obj = null ; // 接收读取的内容
ObjectInputStream ois =null;
try{
ois = new ObjectInputStream(new FileInputStream(f)) ; // 实例化对象输入流
obj = ois.readObject(); //循环下面的数据
System.out.println(obj);
while(obj!=null){
obj = ois.readObject(); //循环下面的数据
System.out.println(obj);
}
}catch(Exception e){
throw e ;
}finally{
if(ois!=null){
ois.close() ; // 关闭
}
}
}
展开
 我来答
雪色精魂
2015-01-24 · TA获得超过181个赞
知道小有建树答主
回答量:234
采纳率:0%
帮助的人:159万
展开全部
    /* 
    本人也在学习java,关于这个问题查了半天资料,大概了解了怎么回事。整理一下思路,如下:
    ObjectInputStream和ObjectOutputStream类可以对对象进行读取操作,ObjectOutputStream要求写入的对象必须实现Serialiable接口(可序列化),而ObjectInputStream对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。写入就不说了,在读取的时候使用readObject()方法。 
    方法签名:public final Object readObject()throws IOException,ClassNotFoundException 描述:当 InputStream 中出现问题或者遇到不应反序列化的类时,将抛出异常。所有异常对于 InputStream 而言都是致命的,将使其处于不确定状态;是忽略还是恢复流状态取决于调用者。抛出ClassNotFoundException,InvalidClassException,StreamCorruptedException,OptionalDataException和IOExcepiton(更具体的可以查看api文档),那EOFExcepiton从哪里来的呢,找了下源码,readObject--》readObject0--》peekByte,顺便摘一下带代码:(这里说的是EOFException,不关心可以直接跳过)*/
 byte peekByte() throws IOException {

            int val = peek();

            if (val < 0) {

                throw new EOFException();

            }

            return (byte) val;

        } 
/*
    程序到此抛出了到达文件末尾异常(EOFException),也就是说流已经达到末尾了,而你试图继续进行readObject操作。在本题中就是while(obj!=null),readObject方法的返回值是object,当并没有说明达到结尾时的返回值是null(也就是说不能以obj!=null来判断后续是否还有对象),那该怎么办呢?
    最初,想到了本类中的available()方法,即用while(dis.available()>0)来作为条件,结果一样报EOFException,测试后才发现dis.available()方法的返回值始终为0,原来对于用ObjectOutputStream写入的文件就是如此,(available()方法中也有说明:Returns the number of bytes that can be read without blocking.注意要without blocking)。那怎么办?上网查了查了下资料,有三种方法可以解决这个问题:
    1,使用容器类来存储对象,如List,StringBuffered等,一次写入和读取,添加修改对象通过容器类。
    2,在文件中写入个额外的变量,如int length 用于记录存了多少个对象进入,通过while(length>0)进行判断,但是在对文件中的对象进行增删操作时要同时修改length。
    3,通过捕获EOFExceptin来判断已经达到了文件的末尾(思路很巧妙)。  
以下是你的代码,只有while()处有点改动,后面还添了个catch(EOFException e)块,其他都没变(类School和Student2是我自己根据你的代码添加了,可能和你的不一样)。运行结果:
Student2 [name=zhangsa, id=30]

Student2 [name=mnc, id=30]

已经达到文件末尾  
  
*/   
  import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.RandomAccessFile;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
class School{
 private String name;
 public List<Student2> list;
 public School(String name) {
  this.name = name;
 }
 public  List<Student2> getAllStudents() {
  if(list == null)
   list = new ArrayList<Student2>();
  return list;
 }
}
class Student2 implements Serializable{
 /**
  * 
  */
 private static final long serialVersionUID = 1L;
 private String name;
 private int id;
 public Student2(String name, int id) {
  this.name = name;
  this.id = id;
 }
 @Override
 public String toString() {
  return "Student2 [name=" + name + ", id=" + id + "]";
 }
 
}
public class Test01 {
 public static void main(String args[]) throws Exception{
  File f=new File("d:"+File.separator+"test2.txt");  
//  RandomAccessFile rdf=new RandomAccessFile(f,"rw");    
  School sch = new School("西南大学");   
  Student2 s1=new Student2("zhangsa",30);    
  Student2 s2=new Student2("mnc",30);      
  sch.getAllStudents().add(s1);     
  sch.getAllStudents().add(s2);  
  
  Iterator<Student2> iter=sch.getAllStudents().iterator();       
  ObjectOutputStream oos= null ;        
  oos = new ObjectOutputStream(new FileOutputStream(f)) ;
  while(iter.hasNext())
  {
   Student2 a5=iter.next();
   oos.writeObject(a5) ; 
  }  
  Object obj = null ; // 接收读取的内容   
  ObjectInputStream ois =null;   
  try{  
   
   ois = new ObjectInputStream(new FileInputStream(f)) ; // 实例化对象输入流   
   while(true)//直接用while(true),让读取操作一直进行
   {   
    obj = ois.readObject(); //循环下面的数据   
    System.out.println(obj);   
   }    
  }catch(EOFException e){  //此处捕获EOFException 
   System.out.println("已经达到文件末尾");
  }catch(IOException e){
   e.printStackTrace();
  }
  finally{  
    if(ois!=null)
    { 
     ois.close() ; // 关闭   
    }  
    if(oos!=null)
     oos.close();
  }
 } 
}
armslave88
2015-01-24 · TA获得超过416个赞
知道小有建树答主
回答量:535
采纳率:100%
帮助的人:460万
展开全部
内部类BlockDataInputStream.的方法peekByte抛出的异常,意思就是到达了文件的末尾,程序却没有正常结束读取文件内容,你可以单步调试一下看看到达文件末尾之后程序为什么没有停下来
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
_ehsu_
2015-01-24 · TA获得超过489个赞
知道小有建树答主
回答量:1298
采纳率:100%
帮助的人:559万
展开全部
贴具体的 exception trace
更多追问追答
追问

追答
56 行驶哪儿?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
batles
2018-03-10
知道答主
回答量:9
采纳率:0%
帮助的人:4.7万
展开全部

请参考:网页链接

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式