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. IOException などをスローするように readQ() メソッドを宣言し、その呼び出しを try/catch ブロックに入れるか、または
  2. 今のように独自の例外をキャッチし、今のように例外で null を返します (何が起こっているかを知るために例外をログに記録することを忘れないでください) が、それを呼び出した後に null をテストします。

現時点では、メソッドが成功すると盲目的に想定しているだけです。それはしません。

注: ファイルが空の場合、「空のキューが格納されている」という意味ではありません。これは、ファイルへの書き込みで壊滅的な失敗があったことを意味しますが、ここに示されているように、あなたの慣習に従って無視したことは間違いありません。

于 2013-10-24T21:13:25.737 に答える