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.