我试图从包含多个类对象的文件中读取数据。但是在向列表添加对象时,我得到了空指针异常。有人可以帮忙吗?
以下代码:
//I'm following the same approach, but getting null Pointer exception while
//adding the object to a list. I'll post my code below. Can anyone help?
public class DeserializingMultipleObjects {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {
//create few objects of student class and serialize them in a single file
Student st1= new Student(1, "abhishek", 24, 1);
Student st2= new Student(2, "Prashant",23,3);
Student st3= new Student(3,"Gayatri",22,2);
Student st4= new Student(4,"Ankul",23,4);
FileOutputStream fout= null;
FileInputStream fin= null;
ObjectInputStream oin=null;
ObjectOutputStream oout= null;
List <Student> studentList=null;
try{
fout= new FileOutputStream("Student.ser");
oout= new ObjectOutputStream(fout);
oout.writeObject(st1);
oout.writeObject(st2);
oout.writeObject(st3);
oout.writeObject(st4);
//objects have been serialized. Now read them and populate in a list
fin= new FileInputStream("Student.ser");
oin= new ObjectInputStream(fin);
boolean flag=false;
while(!flag){
if(oin.readObject()==null || oin.readObject().equals("")){
flag=true;
}
else{
studentList.add((Student)oin.readObject());
}
}
}
catch (ClassNotFoundException ex) {
Logger.getLogger(DeserializingMultipleObjects.class.getName()).log(Level.SEVERE, null, ex);
} finally{
if(fout !=null) try {
fout.close();
} catch (IOException ex) {
Logger.getLogger(DeserializingMultipleObjects.class.getName()).log(Level.SEVERE, null, ex);
}
if(oout !=null){
oout.close();
}
if(fin !=null){
fin.close();
}
if(oin !=null){
oin.close();
}
for(Student student: studentList){
System.out.println(student.name);
}
}
}
}
答案 0 :(得分:1)
每次迭代都会读取对象三次。
while(!flag){
Student st = oin.readObject();
if(st == null){
flag=true;
}
else{
studentList.add(st);
}
}
答案 1 :(得分:0)
List <Student> studentList=null;
正在提供错误。当您使用studentList
到达要添加到studentList.add((Student)oin.readObject());
的部分时,该列表是空指针,因为您已将其初始化为此。
您可能希望将列表初始化为null以外的其他内容,例如List<Student> studentList = new ArrayList<Student>();
答案 2 :(得分:0)
有几个错误:
每次调用readObject()
时,都会从流中读取下一个对象,因此以下行:
if(oin.readObject()==null || oin.readObject().equals("")){
flag=true;
}
else{
studentList.add((Student)oin.readObject());
}
读取2或3个对象,而不是仅读取一个。他们应该是
Object read = oin.readObject()
if(read == null || read.equals("")){
flag=true;
}
else {
studentList.add((Student) read);
}
但readObject()
永远不会返回null,并且它无法返回空字符串,因为您只在流中编写了Student实例。
如果您只是将您的4名学生存储在List<Student>
并列入此列表,那么一切都会轻松得多。反序列化只需要读取一个对象(因此,不需要循环):学生列表。
此外,关闭ObjectOutputStream将自动关闭FileOutputStream。对于ObjectInputStream也是如此。因此不需要关闭文件流。为了更清洁,更安全的资源处理,您应该使用try-with-resources。