Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Problema con ObjectInputStream ed OutputStream

    Ciao Ragazzi,

    mi sapete dire come mai quando questo metodo viene invocato lancia l'eccezione e dunque determina l'uscita dal programma?

    codice:
    	public int contaLibretti() throws IOException, ClassNotFoundException
    	{
                FileInputStream lettura = new FileInputStream(f);
                ObjectInputStream leggi = new ObjectInputStream(lettura);
                Libretto librettoRead = (Libretto)leggi.readObject();
                int cont = 0;
    		
    		while(librettoRead!=null)
    		{
                        if(librettoRead.getID().equalsIgnoreCase("lib")) // Faccio la ricerca tra i libretti
                        {
                            cont++;
                        }
                        
                        librettoRead = (Libretto)leggi.readObject();
    		}
    		
                leggi.close();
    		
                return cont;
    	}
    Inoltre anche gli altri metodi che usano l'ObjectInputStream non fanno funzionare il programma!

    Grazie in anticipo per la risposta!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Da quello che vedo nel codice, in pratica leggi, leggi, leggi, finché non viene lanciato EOFException. readObject() non ti restituisce null se non ci sono più oggetti! Sei tu che devi stabilire un modo per capire quanti oggetti ci sono. Esistono diverse strade:

    a) Catturi EOFException, quindi in quel caso sai che non ci sono più oggetti, chiudi tutto ed esci.
    b) All'inizio dello stream scrivi un oggetto o un tipo primitivo che indica quanti oggetti ci sono (ma questo presuppone di sapere in anticipo quanti oggetti scrivere e non è sempre possibile).
    c) Alla fine dello stream scrivi un oggetto "particolare", ad esempio di una tua classe MyEOF. Un oggetto "marcatore" della fine degli oggetti, insomma, che testerai poi con instanceof.

    Delle 3 preferirei la a) o la b).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Quindi quale sarebbe la condizione del ciclo?

    Grazie ancora...

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,327
    Dipende da quale delle tre possibilità intendi utilizzare

    Se scegli la prima non hai condizioni del while, ma utilizzi un try/catch per uscire:
    codice:
    try {
       while( true ) {
          ...   // Leggi
       }
    } catch (EOFException eof) {
       // Non ci sono più oggetti nel file
    }
    Se scegli il secondo non avrai più bisogno del while, ma utilizzerai un ciclo for:
    codice:
    Integer quanti = (Integer) leggi.readObject();
    for(int i=0; i<quanti.intValue(); i++) {
       // leggi gli altri oggetti
    }
    Se scegli la terza, la condizione sarà nell'if interna al while:
    codice:
    boolean esco = false;
    while( !esco ) {
       Object obj = (Object) leggi.readObject();
       if (obj instanceof TuoOggettoMarcatore) {
          esco = true;
       } else {
          // E' un oggetto Libretto.
       }
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Ok...sei stato molto chiaro! Però il problema persiste se viene invocato il seguente metodo:

    codice:
    	public void inserisciLibretto(Libretto newLibretto) throws IOException, ClassNotFoundException, EOFException
    	{
                FileOutputStream scrittura = new FileOutputStream(f);
                ObjectOutputStream scrivi = new ObjectOutputStream(scrittura);
    
                scrivi.writeObject(newLibretto);
    
                scrivi.close();		
    	}
    Lo scopo del metodo è quello di scrivere nel file un nuovo oggetto Libretto, però nel momento in cui viene invocato il metodo il programma termina (eppure nel main ho catturato le eccezioni usando il gestore try/catch)!

    Grazie ancora...

  6. #6
    Nessuno sa aiutarmi?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.