2011-01-20 4 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."); 

     } 

} 

Это класс Книжный магазин, который я использую только для хранения ArrayList объектов книги в orded, чтобы использовать его в потоках объектов.

public class Bookstore implements Serializable { 


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

    public Bookstore(ArrayList<Book> biblia) { 

     myBooks = biblia; 

    } 

} 

Я также импортировал все нужные библиотеки. То, что я пытаюсь сделать, это: Если файл не пуст, тогда откройте ArrayList (объект книжного магазина, который содержит arraylist). Если он пуст, напишите новый. Проблема в том, что единственное, что я получаю в результате, - «Ошибка ввода-вывода». и я не могу понять, почему.

+0

Вы должны больше подумать о том, как проверить, существует ли файл или нет.). То, как вы делаете это сейчас, на самом деле не работает. –

+0

внутри вашего блока catch (IOException ex2), добавьте «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()) {...} Nightsorrow, и я думал, что fis.read() был альтернативой, но вы правы, это не работает правильно. – Felice

0

Nightsorrow, вероятно, прав. Чтобы ответить, почему вы получаете сообщение «IO Error», это потому, что вы сказали программе распечатать это, если произошла ошибка ввода-вывода. Для целей отладки кода я бы удалить часть кода

catch (IOException ex2) { 

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

    } 

или закомментируйте его, так что вы можете получить трассировку стека. Затем вы можете определить, где и почему возникает ошибка, потому что она даст вам исключение и какую строку выбрало исключение.

Смежные вопросы