【问题标题】:Java: Reading Queue Object using ObjectInputStream from file is giving nullPointerException [duplicate]Java:使用文件中的 ObjectInputStream 读取队列对象给出 nullPointerException [重复]
【发布时间】:2013-11-03 16:45:07
【问题描述】:

我有存储队列内容的 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 并且我的程序停止工作。

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

请帮忙。谢谢。

【问题讨论】:

  • 你忘了实现Serializable
  • 好吧,我已经实现了Serializable,忘记在这里展示了。仍然出现同样的错误。
  • 如果问题是空文件的NPE,捕获它并返回一个null对象。
  • @alfasin:如果有一些存储的条目,请查看我的程序是否正常运行。只有在没有存储条目时才会出现问题。
  • @alfasin:是的,我忘了return null 例外。它现在工作。非常感谢。

标签: java


【解决方案1】:

NPE 是由于您忽略了文件为空时抛出的 EOFException 以及实际上所有 IOExceptions、ClassNotFoundExceptions、RuntimeExceptions 等的令人震惊的做法造成的。不要那样做。 要么:

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

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

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

【讨论】:

  • 哦..我忘了return null 例外。非常感谢@EJP 的建议。它现在可以工作了。
猜你喜欢
  • 2014-05-30
  • 2012-09-22
  • 2013-07-07
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-12
相关资源
最近更新 更多