Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    12

    eseguire metodo che carica Oggetto da file

    Ciao a tutti. Ho due problemi:

    Nella classe Bilancio ho questo metodo per caricare un oggetto Bilancio da file:
    codice:
    public Bilancio loadFile(String nome){
        	try{
        		ObjectInputStream in = new ObjectInputStream(new FileInputStream(nome));
        		Bilancio b = (Bilancio) in.readObject();
        		
        		in.close();
        		return b;
        	}
        	catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch(FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        	
        }
    Errore generato: "il metodo deve restituire un dato di tipo bilancio". In pratica non mi legge il return. Ho provato a metterlo fuori dal try ma se lo fo, non mi identifica b.

    Secondo problema: nell'eseguibile EseguiBilancio devo lanciare il metodo loadFile. Come faccio?
    Va bene il codice:
    codice:
    Bilancio b = new Bilancio();
    b.loadFile(nome_file);
    ?

    Grazie a tutti

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: eseguire metodo che carica Oggetto da file

    Originariamente inviato da ffarr
    Errore generato: "il metodo deve restituire un dato di tipo bilancio". In pratica non mi legge il return.
    Poniti la domanda: se la esecuzione arriva in uno dei catch .... cosa si restituisce? Quel return b; non centra più. Dopo il printStackTrace resta sguarnito di un return!!

    Qualunque sia il "flusso" del metodo ci deve essere una "ragione" di uscita: ritorno di un valore (se non void) o lancio di fuori di una eccezione.

    Sarebbe meglio gestire "a monte" le eccezioni, non lì in quel metodo. Un modo valido sarebbe questo:

    codice:
    public Bilancio loadFile(String nome) throws ClassNotFoundException, IOException {
        FileInputStream fis = new FileInputStream(nome);
        ObjectInputStream ois = null;
    
        try {
            ois = new ObjectInputStream(fis);
            return (Bilancio) ois.readObject();
        } finally {
            if (ois != null) {
                ois.close();
            } else {
                fis.close();
            }
        }
    }
    Con un design un po' diverso si potrebbe creare una eccezione apposita per l'I/O Bilancio es. una classe IOBilancioException

    codice:
    public class IOBilancioException extends Exception {
        public IOBilancioException(String message, Throwable cause) {
            super(message, cause);
        }
    }
    E poi fare in modo che loadFile possa lanciare di fuori solo IOBilancioException che "incapsula" come causa (nel caso servisse per lo stack trace o altro) eventuali eccezioni:

    codice:
    public Bilancio loadFile(String nome) throws IOBilancioException {
        try {
            FileInputStream fis = new FileInputStream(nome);
            ObjectInputStream ois = null;
    
            try {
                ois = new ObjectInputStream(fis);
                return (Bilancio) ois.readObject();
            } finally {
                if (ois != null) {
                    ois.close();
                } else {
                    fis.close();
                }
            }
        } catch (Exception e) {
            throw new IOBilancioException("Errore nel caricamento del bilancio", e);
        }
    }
    Sono entrambi modi validi, solo con due design differenti. Il secondo incapsula meglio e quindi astrae di più dalle eccezioni di "basso" livello.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    12
    Grazie dell'aiuto, prezioso come al solito.
    Ho scelto la prima soluzione che hai proposto.


    codice:
    public Bilancio loadFile(String nome) throws ClassNotFoundException, IOException {
        FileInputStream fis = new FileInputStream(nome);
        ObjectInputStream ois = null;
    
        try {
            ois = new ObjectInputStream(fis);
            return (Bilancio) ois.readObject();
        } finally {
            if (ois != null) {
                ois.close();
            } else {
                fis.close();
            }
        }
    }
    Il problema sorge quando vado a richiamarla nell'EseguiBilancio.
    Il mio scopo è semplice: caricare il Bilancio e poi continuare a lavorare su quello, con tutti gli altri metodi che ho creato ecc.
    Ecco, non so come fare. Ho pensato di creare un nuovo Bilancio nel main di EseguiBilancio e clonare il bilancio caricato con il loadFile().
    Però quello che mi manca è il codice, o un esempio funzionante da cui trarre ispirazione.

    In pratica mi mancano due righe di codice da inserire nell'EseguiBilancio per caricare il Bilancio da file e continuare a lavorare su quello.

    Grazie

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.