2015-01-09 1 views
0

У меня есть эта ошибка:проблемы с ObjectInputStream, возвращая неверное значение

Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList cannot be cast to domein.Auto 

Значение я получаю это:

[[nummerplaat= 123xyz, merk= Toyota, model = Yaris, nummerplaat= 456abc, merk= Opel, model = Astra, nummerplaat= azerty, merk= BMW, model = Berline, nummerplaat= qwerty, merk= Toyota, model = Avensis, nummerplaat= 789cde, merk= Mercedes, model = C-klasse Berline, nummerplaat= 567xyz, merk= Renault, model = Fluence, nummerplaat= ab12ab, merk= Opel, model = Zafira, nummerplaat= xy12xy, merk= Peugeot, model = 308]] 

Однако это должно быть:

[nummerplaat= 123xyz, merk= Toyota, model = Yaris, nummerplaat= 456abc, merk= Opel, model = Astra, nummerplaat= azerty, merk= BMW, model = Berline, nummerplaat= qwerty, merk= Toyota, model = Avensis, nummerplaat= 789cde, merk= Mercedes, model = C-klasse Berline, nummerplaat= 567xyz, merk= Renault, model = Fluence, nummerplaat= ab12ab, merk= Opel, model = Zafira, nummerplaat= xy12xy, merk= Peugeot, model = 308] 

код, который я использую, является следующим:

public class ObjectStreamManipulaties { 

    public <E> List<E> geefObjecten(File naamBestand) { 
     List<E> li = new ArrayList<>(); 

     try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(naamBestand))) { 
      while (true) { 
       li.add((E) ois.readObject()); 
      } 
     } catch (EOFException e) { 
//EOF bereikt, continue 
      return li; 
     } catch (IOException | ClassNotFoundException ex) { 
      Logger.getLogger(ObjectStreamManipulaties.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     return null; 
    } 
} 

Я использую этот метод в следующем классе картографа:

package persistentie; 

import java.util.ArrayList; 
import java.util.List; 

import domein.Auto; 
import java.io.File; 

public class AutoMapper { 

    private File naamBestand; 

    public AutoMapper(File bestand){ 
     this.naamBestand = bestand; 
    } 

    public List<Auto> geefAutos() { 

     System.out.println(new ObjectStreamManipulaties().geefObjecten(naamBestand)); 
     return new ObjectStreamManipulaties().geefObjecten(naamBestand); 
    } 
} 

Если я вручную поместить в список, как это все работает:

public List<Auto> geefAutos() { 
     List<Auto> lijstAutos = new ArrayList<Auto>(); 
     lijstAutos.add(new Auto("123xyz", "Toyota", "Yaris")); 
     lijstAutos.add(new Auto("456abc", "Opel", "Astra")); 
     lijstAutos.add(new Auto("azerty", "BMW", "Berline")); 
     lijstAutos.add(new Auto("qwerty", "Toyota", "Avensis")); 
     lijstAutos.add(new Auto("789cde", "Mercedes", "C-klasse Berline")); 
     lijstAutos.add(new Auto("567xyz", "Renault", "Fluence")); 
     lijstAutos.add(new Auto("ab12ab", "Opel", "Zafira")); 
     lijstAutos.add(new Auto("xy12xy", "Peugeot", "308")); 
     return lijstAutos; 

    } 

Это значение с «ли» это не правильно. Что не так в коде?

+0

Какая строка в этом коде генерирует исключение? – RealSkeptic

ответ

1

Вы, кажется, читаете весь список из своего файла, но считаете, что в нем есть отдельные элементы. Вместо вашего while(true) петля, просто сделайте li = (List<E>) ois.readObject();

+0

это работает для моей ошибки, но затем, когда я использую метод в другом файле, это дает еще одну ошибку: Исключение в потоке «main» java.lang.ClassCastException: domein.Onderhoud нельзя отнести к java.util.List –

+0

Итак, другой файл имеет различное содержимое :) Код, который считывает данные, должен соответствовать коду, который его написал. Если вы сохранили Список, вы должны будете прочитать список, и если вы спасли отдельные автомобили, вы должны прочитать их один за другим. Если вам нужно, вы можете сделать оба способа работать с чем-то вроде этого: 'Object o = ois.readObject(); if (o instanceof List) {return (Список ) o} else do {li.add ((E) o); o = try {ois.readObject(); } catch (EOFException e) {break; }} while (true); ' – Dima

+0

Привет, да, я разрешил это с помощью двух разных методов, где 1 - это решение, которое вы дали. Благодаря! –

0

Без вывода (при сохранении файла) кода я не могу вам помочь; Однако попробуйте ввести/вывести весь объект списка вместо сохранения элемента по элементу, намного проще.

+0

Я не знаю, что вы имеете в виду, я не сохраняю свой файл, я просто прочитал его. –

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