PDA

View Full Version : [Java] actionPerformed + IOException


JPacifica
13-11-2008, 19:17
Salve Raga,
Ho un problema come da titolo... ma vi spiego meglio:

allora sto gestendo un menu e devo aggiungere il gestore dell'evento di un tasto, ma all'interno ho bisogno di richiamare un metodo che potrebbe lanciare una IOException (Scrive su un file di testo), vi incollo il codice che lo capirete sicuramente meglio:


Item.addAciontListener(new ActionListener() {
public void actionPerformed(ActionEvent eventitem) {
//codice
//Chiamo la funzione che lancia eccezioni
}
});

Ecco sommariamente è questo il codice che mi deve partire... mi sono :mc: cercando di trovare soluzioni alterative, ma quella di chiamare la funzione li dentro è l'unico modo.... e ovviamente il metodo acrionPerformed per come lo erredito non puo lanciare eccezioni di IO

Scusa se la soluzione potrebbe essere banale, ma sto facendo questo progetto per l'università ed è da poco che programmo ad oggetti.
Grazie mille

Oceans11
13-11-2008, 22:22
Anche se l'ereditarietà ti vieta di lanciare l'eccezione e di propagarla al metodo chiamante, puoi comunque gestire l'eccezione lì dentro.

Racchiudi il codice in un blocco try catch.

banryu79
14-11-2008, 09:13
Da dentro il metodo actionPerformed() del tuo Item [immagino si tratti di MenuItem visto che parli di un menu] incapsuli il codice che fa il lavoro di scrivere su file in un altro thread e lanci il thread.

Tutto qua. In questo modo:

1) una eventuale eccezione di IO durante la scrittura su file dovrebbe venire propagata, dato che actionPerformed() temina appena lanciato il thread e quindi l'eccezione non viene propagata nel suo "scope";

2) come secondo beneficio ottieni il fatto di far eseguire l'operazione di scrittura su file su un thread diverso dall'EDT che dovrebbe processare solo gli eventi grafici di AWT/Swing.
Nello "scope" del metodo actionPerformed() del tuo Item ti trovi appunto in un contesto che viene eseguito dall'EDT; se, supponiamo, il file da scrivere è molto grande (che so: 100 MB) per tutto il tempo di scrittura su disco la tua interfaccia grafica rimmarrà bloccata in attesa del termine dell'operazione, e quindi non si aggiornerà ne permetterà all'utente di continuare ad usarla.
Per questo tali operazioni che sono scatenate dai metodi actionPerformed(), di solito, si fanno eseguire a thread esterni.