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.
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
}
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());
}
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());
}
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();
}
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();
}

Java lezione 5

  • 1.
    1 Gestione delle eccezioni Javadispone 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 Leeccezioni 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 throwsper 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 leclassi 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 leclassi 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(); }