2011-01-20 8 views
0

以下のコードはIOExceptionを返します。ここに私のメインです:Serializable ArrayList - IOExceptionエラー

public class Main 
{ 

    public static void main(String[] args) { 

Book b1 = new Book(100, "The Big Book of Top Gear 2010", "Top Gear", 
       "BBC Books", 120, "Book about cars."); 

Book b2 = new Book(200, "The Da Vinci Code", "Dan Brown", "Vatican", 450, 
       "A fast paced thriller with riddles."); 

Book b3 = new Book(300, "Le Petit Nicolas", "Sempe Goscinny", "Folio", 156, 
       "The adventures of petit Nicolas."); 

ArrayList<Book> biblia = new ArrayList<Book>(); 

biblia.add(b1); 

biblia.add(b2); 

biblia.add(b3); 

File f = new File("objects"); 

     try { 

      FileInputStream fis = new FileInputStream("objects"); 

      int u = fis.read(); 

      if (u != -1) { 

       ObjectInputStream ois = new ObjectInputStream(fis); 

       Bookstore b = (Bookstore) ois.readObject(); 

       ois.close(); 

      } else { 

       Bookstore b = new Bookstore(biblia); 

       FileOutputStream fos = new FileOutputStream("objects"); 

       ObjectOutputStream oos = new ObjectOutputStream(fos); 

       oos.writeObject(b); 

       oos.close(); 

      } 

     } catch (FileNotFoundException ex1) { 

      System.out.println("File not found."); 

     } catch (IOException ex2) { 

      System.out.println("IO Error."); 

     } catch (ClassNotFoundException ex3) { 

      System.out.println("Class not found."); 

     } 

} 

これは私がオブジェクトストリームにそれを使用するordedにブックオブジェクトのArrayListのを保存するためだけに使用書店クラスがあります。

public class Bookstore implements Serializable { 


    private ArrayList<Book> myBooks = new ArrayList<Book>(); 

    public Bookstore(ArrayList<Book> biblia) { 

     myBooks = biblia; 

    } 

} 

すべての適切なライブラリもインポートしました。 私がしようとしていることは:ファイルが空でない場合、そこからArrayList(arraylistを含む書店オブジェクト)を読み込みます。それが空の場合は、新しいものを書いてください。 問題は、私が返す唯一のものは "IO Error"です。なぜ私は理解できません。

+0

ファイルが存在するかどうかをテストする方法についてもっと知っておくべきです:)。あなたが今やっているやり方は実際には機能していません。キャッチ(IOException ex2)ブロックの内側に –

+0

を追加し、 "ex2.printStackTrace();"を追加します。あなたの例外が発生している場所の詳細を取得します。 –

+0

ありがとう。私は何も変えなかったが、今はうまくいくようだ。 :S – Felice

答えて

1

例外が発生したときにスタックトレースを出力すると、これらの問題をデバッグするのに役立ちますが、そのブックはシリアル化できないと推測しています。

2

ファイルが存在するかどうかをテストするのは間違った方法です。存在しないファイルからストリームを作成しようとしていますが、FileNotFoundExceptionがスローされます。代わりに:

FileInputStream fis = new FileInputStream("objects");    
int u = fis.read(); 
if (u != -1) { 

はちょうど

if(f.exists()) { ... } 
+0

私はすでに(f.exists()){...}と思っていましたが、fis.read()は代わりのものだと思っていました。 – Felice

0

Nightsorrowはおそらく正しいです使用しています。 IOエラーが発生した理由を答えるには、IOエラーがあった場合に印刷するようプログラムに指示したからです。あなたのコードをデバッグする目的のために私はあなたのコードの

catch (IOException ex2) { 

     System.out.println("IO Error."); 

    } 

セクションを削除したり、スタックトレースを取得することができるようにそれをコメントアウトします。次に、例外が発生し、その例外がスローされた行があるため、エラーが発生した場所と理由を特定できます。