Piccolo suggerimento per quando si ha a che fare con l'apertura (per lettura/scrittura) di file. Questa è la procedura corretta del trattamento di questa situazione:
codice:
// Dichiarazione di tutti gli oggetti che andranno usati
// e loro inizializzazione a null
...
try {
... // Inizializzazione ed uso degli oggetti
} catch (Exception e) {
... // Cattura di eventuali eccezioni
} finally {
... // Test di corretta inizializzazione e chiusura delle risorse,
... // in ordine inverso rispetto all'inizializzazione
}
Esempio di trattamento della scrittura di un file di testo, con bufferizzazione:
codice:
// Dichiaro tutti gli oggetti che userò e li inizializzo a null
FileWriter fw = null;
BufferedWriter bw = null;
PrintWriter pw = null;
try {
// Inizializzo e uso gli oggetti
fw = new FileWriter("pippo.txt");
bw = new BufferedWriter( fw );
pw = new PrintWriter( bw );
// Scrivo sul file
pw.println("Ci scrivo tutto quello che voglio");
// Flush dei dati
pw.flush();
} catch (Exception e) {
// Catturo eventuali eccezioni
e.printStackTrace();
} finally {
// Verifico che tutto sia stato inizializzato
// e chiudo, in ordine inverso rispetto all'inizializzazione
if (pw != null) {
try { pw.close(); } catch (Exception e) { }
} else {
if (bw != null) {
try { bw.close(); } catch (Exception e) { }
} else {
if (fw != null) {
try { fw.close(); } catch (Exception e) { }
}
}
}
}
Nota: l'ultimo oggetto che viene inizializzato è il primo ad essere controllato. Se questo è diverso da null, allora chiudo solo quello in quanto tutte le altre chiusure vengono fatte a catena automaticamente. Ovvero, se "pw" è inizializzato, allora sono per forza di cose inizializzati anche "bw" (visto che l'ho usato per costruire "pw") e "fw", visto che l'ho usato per costruire "bw". Chiudendo "pw", automaticamente vengono chiusi anche "bw" e "fw".
Nota2: le chiusure vanno sempre fatte nel blocco finally, in modo da garantire che queste vengano effettivamente fatte sempre (anche in caso di eccezione).
Ciao.