PDA

Visualizza la versione completa : JAVA: Exception???


Mappa
14-10-2003, 11:10
A tutti.
Frequento un corso di Java. Non mi è chiera la parte che riguarda l'intercettazione degli errori: try, catch, throw e finally .
Qualcuno riuscirebbe in parole semplici a spiegarmele?
Vi ringrazio moltissimo
By

LeleFT
14-10-2003, 11:44
Un'eccezione è un errore che può accadere durante una certa operazione. Prendiamo come esempio la conversione in un intero della rappresentazione stringa di un numero.

Se io ho la rappresentazione del numero 25 in una stringa (significa che ho un oggetto String che mi rappresenta il 25 in questo modo: "25") e voglio far sì che tale valore mi venga inserito in una variabile di tipo int, devo ricorrere alla classe wrapper Integer, usando il metodo statico parseInt:


String mioNumero = "25";
int nuemro = Integer.parseInt(mioNumero);


Il problema sorge quando tento di convertire in intero una stringa che non mi rappresenta nessun numero:


String mioNumero = "Ciao!";
int numero = Integer.parseInt(mioNumero);


Cosa succede in questo caso? Viene generata un'eccezione. Il compilatore, non può sapere a priori quando questo succederà, perchè se la mia stringa viene inizializzata a tempo d'esecuzione, non so cosa verrà a contenere (un numero valido oppure no!). E qui nascono le ECCEZIONI: ci sono dei metodi che non possono sapere a priori se andranno a buon fine o no. In questi casi si costringe il programmatore ad intercettare i possibili errori.
Per fare questo, si inseriscono tutte le istruzioni "potenzialmente pericolose" in un blocco try...catch:


String mioNumero = "25";
try {
int numero = Integer.parseInt(mioNumero);
} catch (NumberFormatException nfe) {}

Se l'istruzione (o una delle istruzioni nel blocco) non dovesse andare a buon fine, allora l'eccezione sollevata viene catturata dal blocco catch corrispondente.
Nell'esempio precedente viene raccolta un'eccezione di tipo NumberFormatException (che è la particolare eccezione lanciata dal metodo parseInt(), in generale si può catturare qualsiasi eccezione semplicemente intercettandole con catch(Exception e) ).

Quali sono i metodi che possono generare eccezioni: in generale TUTTI quei metodi che si occupano di I/O (le periferiche possono generare errori inaspettati!), poi le istruzioni che hanno a che fare con conversioni tra forme particolari di dati.

Il programmatore di una classe, però, potrebbe non essere in teressato a catturare egli stesso l'eccezione, ma lasciare che sia il programmatore che la usa a doverlo fare. In questo caso si dichiara il metodo come "generatore di possibili eccezioni". Basta semplicemente aggiungere alal dichiarazione del metodo la parola chiave throws seguita dal tipo di eccezione che il metodo può lanciare. Supponiamo di voler realizzare una classe che converte una stringa in un intero e di non volerci preoccupare se viene lanciata un'eccezione:


public int converti(String numero) throws NumberFormatException {
return Integer.parseInt(numero);
}

Il programmatore che userà la nostra classe DOVRA' racchiudere il metodo converti() in un blocco try...catch.

Supponiamo, ora, di voler definire una nostra eccezione e di lanciarla (perchè ci piace così!):


public int converti(String numero) throws NostraEccezioneNumerica {
int numeroNuovo = 0;
try {
numeroNuovo = Integer.parseInt(numero);
} catch (Exception e) {
throw new NostraEccezioneNumerica();
}
return numeroNuovo;
}

Ora siamo noi a lanciare forzatamente un'eccezione. (E' chiaro che dovremo definire una classe NostraEccezioneNumerica che estende Exception o Throwable, per poterlo fare).

In ogni caso, la gestione delle eccezioni è nua parte fondamentale della programmazione OO (e non). Se non vogliamo che il nostro programma vada in crash appena qualcosa va storto (a causa dell'utente o a causa del S.O.) dobbiamo preoccuparci di gestirle per fornire, magari, anche un messaggio d'errore, che spieghi cosa è accaduto.

Il blocco finally serve per terminare un blocco try...catch: supponiamo che il nostro metodo debba aprire un file, poi scrivere il contenuto di un array al suo interno. Può succedere che l'apertura vada a buon fine, ma che scrivendo la nostra classe, noi non abbiamo tenuto conto di un possibile errore: lo sconfinamento dell'array! Cosa accade: viene aperto il file, vengono scritte tutte le informazioni dell'array, poi si tenta di accedere ad un elemento dell'array INESISTENTE, viene lanciata un'eccezione di tipo ArrayIndexOutOfBoundsException.
Ebbene: il nostro metodo cattura l'eccezione, non la guarda, passa oltre (si può fare!)... IL FILE RIMANE APERTO!!!
In questi casi si usa la clausola finally per inserire tutte le istruzioni che si vogliono vengano eseguite, anche se prima è sorta un'eccezione (la chiusura del file, nel caso sia stato aperto!).

Una cosa devo aggiungere: è possibile catturare DIVERSI TIPI di eccezioni:


try {
// apro il file: posso avere un'eccezione di I/O
// scrivo l'array: posso avere lo sconfinamento
// chiudo il file (non si farebbe qui, ma nel finally)
} catch (IOException ioe) {
... // faccio qualcosa
} catch (ArrayIndexOutOfBoundsException aioobe) {
... // faccio qualcos'altro
} finally {
... // controllo e faccio altro
}

Lo so... la chiarezza non è il mio forte... ma faccio del mio meglio! :gren:


Ciao.

Mappa
14-10-2003, 14:02
GRAZIE MILLE LeleFT
oltre ad essere molto gentile sei sttao molto ma molto chiaro. Chiaro e sintetico.
Ancora Grazie!!!

Loading