2013-10-24 45 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

相關問題