1. 1
Gestione delle eccezioni
Java dispone di una gestione avanzata delle eccezioni, cioè degli errori di
runtime. Nei vari package esistono numerose eccezioni predefinite. Ma è
anche possibile definire delle eccezioni personalizzate.
Le eccezioni sono a tutti gli effetti delle classi e come tali appartengono ai
package; tutte le eccezioni derivano direttamente o indirettamente dalle
classi Exception e quindi dalla sua superclasse Throwable.
Come è insito nel concetto di ereditarietà, più si scende nella catena
gerarchica e più si avranno eccezioni specializzate. Di conseguenza
Exception è l’eccezione più generica di tutte: cioè le intercetta tutte.
2. try – catch - finally
La sintassi da utilizzare per la gestione delle eccezioni è la seguente:
try{
…. Codice che può generare errori di runtime (eccezioni)
}
catch(NullPointerException npe)
{ System.out.println(npe.getMessage()); //stampa msg errore
npe.printStackTrace(); //stampa il msg d’errore
//e la catena di eccezioni conseguenti
//con indicazione della riga
}
catch(ArrayIndexOutOfBoundException obe)
{
//si tratta di un’eccezione dello stesso livello della precedente
}
catch(Exception e) //essendo più generica va dopo
{
//intercetta tutte le eccezioni sfuggite alle precedenti
}
finally
{
//blocco eseguito sia in caso di eccezioni sia in caso di esecuzione normale
}
3. Lancio di un’eccezione
Le eccezioni vengono normalmente lanciate automaticamente durante
l’esecuzione dalla VM java. Tuttavia è possibile lanciare un’eccezione in modo
manuale. Ricordiamo infatti che le eccezioni sono delle classi e come tali possono
essere istanziate. Ad esempio la classe Exception ha un costruttore che accetta
come parametro il messaggio d’errore.
E’ possibile scrivere un codice di questo tipo:
public void preleva(int importo) throws Exception
{
if(saldo>=importo) saldo-=importo;
else throw new Exception(“Conto scoperto”);
}
Dopo aver scritto questo codice sarà obbligatorio chiamare il metodo preleva
all’interno di un try-catch:
try{
preleva(100);
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
4. Uso di throws per i metodi
La parola chiave throws indica che un metodo lancia una certa eccezione, ma
come conseguenza fa si che la gestione di tale eccezione venga portata a livello
superiore, cioè nella porzione di codice in cui il metodo viene chiamato.
public BufferedReader apriFile(String nomeFile) throws IOException
{
FileReader fr=new FileReader(nomeFile);
BufferedReader out =new BufferedReader(fr);
return out;
}
Quando però chiamerò questo metodo devo ricordarmi di usare il try-catch, a
meno che non mi trovi in un altro metodo che lo rilancia ancora all’esterno.
try
{ BufferReader out=apriFile(“prova.txt”);
……………….
}
catch(IOException ioe)
{
System.out.println(ioe.getMessage());
}
5. Eccezioni Personalizzate
Tutte le classi Exception possono essere estese, quindi possiamo creare delle
nostre Eccezioni come sottoclassi di Exception o di una più specifica eccezione.
public class ContoScopertoException extends Exception
{
public ContoScopertoException()
{ super(“Conto Scoperto”);}
}
Dopo di che potremo modificare in questo modo il metodo preleva
public void preleva(int importo) throws ContoScopertoException
{
if(saldo>=importo) saldo-=importo;
else throw new ContoScopertoException();
}
6. Eccezioni Personalizzate
Tutte le classi Exception possono essere estese, quindi possiamo creare delle
nostre Eccezioni come sottoclassi di Exception o di una più specifica eccezione.
public class ContoScopertoException extends Exception
{
public ContoScopertoException()
{ super(“Conto Scoperto”);}
}
Dopo di che potremo modificare in questo modo il metodo preleva
public void preleva(int importo) throws ContoScopertoException
{
if(saldo>=importo) saldo-=importo;
else throw new ContoScopertoException();
}