2011-01-20 3 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를 포함하는 서점 개체)를 읽는다. 비어 있으면 새 것을 씁니다. 문제는 내가 반환하는 유일한 것은 "입출력 오류"입니다. 나는 왜 그런지 이해할 수 없다.

+0

파일이 존재하는지 여부를 테스트하는 방법에 대해 더 많이 생각해야합니다. :). 당신이 지금하고있는 방식은 실제로 작동하지 않습니다. catch (IOException ex2) 블록 내부에 –

+0

이 있으면 "ex2.printStackTrace();"를 추가하십시오. 귀하의 예외가 발생한 곳에 대한 세부 정보를 얻으십시오. –

+0

감사합니다. 나는 아무것도 변하지 않았지만 지금은 효과가있는 것 같습니다. : S – Felice

답변

1

예외가 발생했을 때 스택 추적을 인쇄하면이 문제를 디버그하는 데 도움이되지만 그 책은 직렬화 할 수 없다고 생각합니다.

2

파일이 존재하는지 테스트하는 것은 잘못된 방법입니다. 존재하지 않는 파일로부터 스트림을 작성하려고하고있어, FileNotFoundException가 Throw됩니다. 대신에 :

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

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

나는 (f.exists()) {...} 밤낮으로 나는 fis.read()가 대안이라고 생각했지만 이미 옳았습니다. – Felice

0

Nightsorrow 아마 맞다 사용합니다. "입출력 오류"가 발생하는 이유에 대한 대답은 입출력 오류가 있으면 인쇄하도록 프로그램에 명령했기 때문입니다. 코드 디버깅을 위해 스택 추적을 얻을 수 있도록

catch (IOException ex2) { 

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

    } 

코드 섹션을 삭제하거나 주석 처리합니다. 그런 다음 예외가 발생하고 해당 예외가 발생한 행이 표시되기 때문에 오류가 발생한 위치와 이유를 정확히 찾아 낼 수 있습니다.