Questa roba qua...

O = ois.readObject();
l.addFirst(O);
while (O !=null)
O = ois.readObject();
l.addFirst(O);

E' come scrivere questo...

codice:
O = ois.readObject();
l.addFirst(O);
while (O !=null)
{
  O = ois.readObject();
}
l.addFirst(O);
E mi sembra chiaro non ha senso...
Scusa, sarà:

codice:
while ((O = ois.readObject()) !=null)
  l.addFirst(O);
così sei sicuro di non aggiungere oggetti nulli
Eppoi.. come sarebbe a dire
credo l'errore sia while (O !=null)
?

Le eccezioni non vanno ammazzate in questo modo! Servono apposta per dirti dov'è l'errore!
Aleno in fase di debug...

codice:
catch (Exception e)
{
  e.printStackTrace();
}
fanne tesoro... ciao!