2013-10-24 38 views
0

我有用于存储队列内容的QStorage类。Java:使用文件中的ObjectInputStream读取队列对象给出nullPointerException

class QStorage{ 
    Queue<A> q = new PriorityQueue<A>(5); 

    public Queue<a> readQ(){ 
    try{ 
    FileInputStream fin = new FileInputStream("/home/requestQ.ser"); 
    ObjectInputStream ois = new ObjectInputStream(fin); 
    q = (Queue)ois.readObject(); 
    }catch(Exception e){} 

    return q; 
    } 
} 

而在另一个类我打电话readq在上述类的()方法将文件的内容排队 存储到一些其他的队列。

class MyQ{ 
    public static void main(String args[]){ 
    QueueStorage qs = new QueueStorage(); 
    Queue<A> myQ = new PriorityQueue<A>(5); 
    myQ = qs.readQ(); 
    //...some other stuffs goes here 
} 
} 

这里如果已经有队列的某些条目存储在文件中,readQ()会正确返回这些条目。但如果没有存储在文件中的条目(我的意思是空队列存储) 那么这种方法给nullPointerException和我的程序停止工作。

注:我有要求,我应该检查存储的内容,而不知道它是否为空或不是 。

请帮忙。谢谢。

+0

你忘了实现'Serializable' – alfasin

+1

那么,我已经实现了'Serializable',忘了在这里显示。仍然得到相同的错误。 – Winn

+0

如果在空文件的情况下问题是NPE,请将其捕获并返回一个“null”对象。 – alfasin

回答

0

NPE是由于你忽视如果文件为空而引发的EOFException的实际操作引起的,实际上所有的IOExceptions,ClassNotFoundExceptions,RuntimeExceptions等等等等都不会这样做。 或者:

  1. 宣布抛出IOException异常等,并把对它的调用在try/catch块,
  2. 有它赶上了自己的例外情况现在readq在()方法, (现在不要忘记g记录异常,以便知道发生了什么),但在调用它之后,为空,则为

目前你只是盲目地认为该方法会成功。它不会。

NB如果文件为空,则不表示'存储空队列'。这意味着你有一个灾难性的失败写入任何文件,根据你的实践,你无疑也忽略了这里所展示的。

+0

哦..我忘了在异常时返回null。非常感谢@EJP的建议。它的工作现在。 – Winn

相关问题