0

我有存储队列内容的 QStorage 类。

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并且我的程序停止工作。

注意:我的要求是在不知道是否为空的情况下检查存储的内容。

请帮忙。谢谢。

4

1 回答 1

0

NPE 是由于您忽略了文件为空时抛出的 EOFException 的骇人听闻的做法,实际上是所有 IOExceptions、ClassNotFoundExceptions、RuntimeExceptions 等等等等。不要那样做。任何一个:

  1. 将 readQ() 方法声明为抛出 IOException 等,并将对它的调用放在 try/catch 块中,或者
  2. 让它像现在一样捕获自己的异常,像现在一样在异常上返回 null (不要忘记 g 记录异常以便您知道发生了什么),但在调用它之后测试null 。

目前,您只是盲目地假设该方法会成功。它不会。

注意如果文件为空,并不意味着“存储了空队列”。这意味着您在将任何内容写入文件时发生了灾难性的失败,根据您在此处展示的实践,您无疑也忽略了这一点。

于 2013-10-24T21:13:25.737 回答