Le eccezioni in Java - unimi.itprog.di.unimi.it/laboratorio/lezioni/lez12.pdfLe eccezioni Indice 1...

Post on 09-Jul-2020

5 views 0 download

Transcript of Le eccezioni in Java - unimi.itprog.di.unimi.it/laboratorio/lezioni/lez12.pdfLe eccezioni Indice 1...

Le eccezioni

Le eccezioni in Java

G. Grossi

17 gennaio 2007

G. Grossi Lezione 12

Le eccezioni

Indice

1 Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Gerarchia eccezioni

Object

Throwable

Error Exception

RunTimeExceptionNon controllate

Controllate

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Indice

1 Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Gestire situazioni eccezionali

Anomalie nei dati in ingresso

Scrivere un’applicazione Java che, preso in ingresso un interopositivo, stampi un saluto convenzionale (“Ciao!”) un numero divolte pari all’argomento specificato

L’istruzione Integer.parseInt(args[0])puo sollevare eccezioni? Quali?L’indicizzazione di array args[0] solleva l’eccezionejava.lang.ArrayIndexOutOfBoundsException(vedi documentazione)Il metodo Integer.parseInt() solleva l’eccezionejava.lang.NumberFormatException (vedidocumentazione)

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Gestire situazioni eccezionali

Anomalie nei dati in ingresso

Scrivere un’applicazione Java che, preso in ingresso un interopositivo, stampi un saluto convenzionale (“Ciao!”) un numero divolte pari all’argomento specificato

L’istruzione Integer.parseInt(args[0])puo sollevare eccezioni? Quali?

L’indicizzazione di array args[0] solleva l’eccezionejava.lang.ArrayIndexOutOfBoundsException(vedi documentazione)Il metodo Integer.parseInt() solleva l’eccezionejava.lang.NumberFormatException (vedidocumentazione)

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Gestire situazioni eccezionali

Anomalie nei dati in ingresso

Scrivere un’applicazione Java che, preso in ingresso un interopositivo, stampi un saluto convenzionale (“Ciao!”) un numero divolte pari all’argomento specificato

L’istruzione Integer.parseInt(args[0])puo sollevare eccezioni? Quali?L’indicizzazione di array args[0] solleva l’eccezionejava.lang.ArrayIndexOutOfBoundsException(vedi documentazione)

Il metodo Integer.parseInt() solleva l’eccezionejava.lang.NumberFormatException (vedidocumentazione)

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Gestire situazioni eccezionali

Anomalie nei dati in ingresso

Scrivere un’applicazione Java che, preso in ingresso un interopositivo, stampi un saluto convenzionale (“Ciao!”) un numero divolte pari all’argomento specificato

L’istruzione Integer.parseInt(args[0])puo sollevare eccezioni? Quali?L’indicizzazione di array args[0] solleva l’eccezionejava.lang.ArrayIndexOutOfBoundsException(vedi documentazione)Il metodo Integer.parseInt() solleva l’eccezionejava.lang.NumberFormatException (vedidocumentazione)

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Esempio

Vedi il codice TantiSaluti.java ...

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Sollevare eccezioni

Gestire situazioni eccezionaliScrivere la classe Clock i cui oggetti siano inizializzati con treinteri, rispettivamente ore, minuti e secondi e i cui valori sianovalidi (ore ∈ [1, 12], min e sec ∈ [0, 59])

Il costruttoreClock(int ore, int minuti, int secondi)sembra appropriato ... ma come discriminare i valori degliargomenti?Per i casi in cui i valori degli argomenti passati a metodi ocostruttori sono inappropriati e bene sollevare l’eccezionejava.lang.IllegalArgumentException (vedidocumentazione)

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Sollevare eccezioni

Gestire situazioni eccezionaliScrivere la classe Clock i cui oggetti siano inizializzati con treinteri, rispettivamente ore, minuti e secondi e i cui valori sianovalidi (ore ∈ [1, 12], min e sec ∈ [0, 59])

Il costruttoreClock(int ore, int minuti, int secondi)sembra appropriato ... ma come discriminare i valori degliargomenti?

Per i casi in cui i valori degli argomenti passati a metodi ocostruttori sono inappropriati e bene sollevare l’eccezionejava.lang.IllegalArgumentException (vedidocumentazione)

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Sollevare eccezioni

Gestire situazioni eccezionaliScrivere la classe Clock i cui oggetti siano inizializzati con treinteri, rispettivamente ore, minuti e secondi e i cui valori sianovalidi (ore ∈ [1, 12], min e sec ∈ [0, 59])

Il costruttoreClock(int ore, int minuti, int secondi)sembra appropriato ... ma come discriminare i valori degliargomenti?Per i casi in cui i valori degli argomenti passati a metodi ocostruttori sono inappropriati e bene sollevare l’eccezionejava.lang.IllegalArgumentException (vedidocumentazione)

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Esempio

Vedi il codice Clock.java ...

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Uso improprio delle eccezioni

Quando usate in modo vantaggioso, le eccezionipossono migliorare l’affidabilita, la leggibilita e ilmantenimento del programma. Quando usateimpropriamente, esse producono l’effetto opposto!

Un esempio aberrante ...

try {int i = 0;while(true)

a[i++] = i;} catch(ArrayIndexOutOfBoundsException e) {}

... in luogo alla forma idiomatica classica:

for (int i = 0; i < a.length; i++)a[i] = i;

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Eccezioni non controllate: RunTimeException

Cosa succederebbe se dovessi scrivereif(t == null) throw new NullPointerException()per ogni riferimento in gioco?Codice superfluo ... la Jvm provvede automaticamente asollevare l’eccezione NullPointerException se ilriferimento non e validoLa famiglia di eccezioni RunTimeException hannoquesto comportamento comune e rappresentano errori diprogrammazione: violazioni di regole semanticheNormalmente non vengono intercettate ma spessosollevate recando informazioni piu specifiche di quellestandard

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Gerarchia eccezioni non controllate

Object

Throwable

Error Exception

RunTimeExceptionVirtualMachineError

OutOfMemoryError ArithmeticException

Non controllate

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Le piu comuni del package java.lang

ArithmeticException Viene sollevata quando si verificanoerrori in operzioni aritmetiche, es. divisione perzero

IllegalArgumentException Viene sollevata quando ilchiamante passa un argomento inappropriato

NumberFormatException Viene sollevata quando si tenta diconvertire una stringa in un formato numerico e lastringa non ha un valore appropriato

ArrayIndexOutOfBoundsException Da sollevare quandosi utilizza un indice esterno al range valido per unarray

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Le piu comuni del package java.lang

ArithmeticException Viene sollevata quando si verificanoerrori in operzioni aritmetiche, es. divisione perzero

IllegalArgumentException Viene sollevata quando ilchiamante passa un argomento inappropriato

NumberFormatException Viene sollevata quando si tenta diconvertire una stringa in un formato numerico e lastringa non ha un valore appropriato

ArrayIndexOutOfBoundsException Da sollevare quandosi utilizza un indice esterno al range valido per unarray

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Le piu comuni del package java.lang

ArithmeticException Viene sollevata quando si verificanoerrori in operzioni aritmetiche, es. divisione perzero

IllegalArgumentException Viene sollevata quando ilchiamante passa un argomento inappropriato

NumberFormatException Viene sollevata quando si tenta diconvertire una stringa in un formato numerico e lastringa non ha un valore appropriato

ArrayIndexOutOfBoundsException Da sollevare quandosi utilizza un indice esterno al range valido per unarray

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Le piu comuni del package java.lang

ArithmeticException Viene sollevata quando si verificanoerrori in operzioni aritmetiche, es. divisione perzero

IllegalArgumentException Viene sollevata quando ilchiamante passa un argomento inappropriato

NumberFormatException Viene sollevata quando si tenta diconvertire una stringa in un formato numerico e lastringa non ha un valore appropriato

ArrayIndexOutOfBoundsException Da sollevare quandosi utilizza un indice esterno al range valido per unarray

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

... le piu comuni del package java.lang

ClassCastException Viene sollevata quando si forza untipo riferimento a un sottotipo di cui l’oggettoeffettivo non e istanza

StringIndexOutOfBoundsException Viene sollevataquando si tenta di accedere ad una posizioneinesistente di una stringa

NegativeArraySizeException Viene sollevata quando sitenta di creare un array di dimensione negativa

NullPointerException Viene sollevata quando si tenta diaccedere ad un oggetto tramite riferimento null

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

... le piu comuni del package java.lang

ClassCastException Viene sollevata quando si forza untipo riferimento a un sottotipo di cui l’oggettoeffettivo non e istanza

StringIndexOutOfBoundsException Viene sollevataquando si tenta di accedere ad una posizioneinesistente di una stringa

NegativeArraySizeException Viene sollevata quando sitenta di creare un array di dimensione negativa

NullPointerException Viene sollevata quando si tenta diaccedere ad un oggetto tramite riferimento null

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

... le piu comuni del package java.lang

ClassCastException Viene sollevata quando si forza untipo riferimento a un sottotipo di cui l’oggettoeffettivo non e istanza

StringIndexOutOfBoundsException Viene sollevataquando si tenta di accedere ad una posizioneinesistente di una stringa

NegativeArraySizeException Viene sollevata quando sitenta di creare un array di dimensione negativa

NullPointerException Viene sollevata quando si tenta diaccedere ad un oggetto tramite riferimento null

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

... le piu comuni del package java.lang

ClassCastException Viene sollevata quando si forza untipo riferimento a un sottotipo di cui l’oggettoeffettivo non e istanza

StringIndexOutOfBoundsException Viene sollevataquando si tenta di accedere ad una posizioneinesistente di una stringa

NegativeArraySizeException Viene sollevata quando sitenta di creare un array di dimensione negativa

NullPointerException Viene sollevata quando si tenta diaccedere ad un oggetto tramite riferimento null

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Indice

1 Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

La classe java.lang.Exception

package java.lang;

public class Exception extends Throwable {static final long serialVersionUID = -3387516993124229948L;

public Exception() {super();

}

public Exception(String message) {super(message);

}

public Exception(String message, Throwable cause) {super(message, cause);

}

public Exception(Throwable cause) {super(cause);

}

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Definire un’eccezione

La gerarchia standard non contempla tutte le possibilieccezioni, quindi si ha spesso la necessita di definirne dinuove piu intonate con la libreria o packagePer crearne una nuova occorre estenderne una esistente,preferibilmente una (se c’e) che ha un significato “vicino” aquella in fase di concepimentoIl modo piu semplice e quello di creare un nuovo tipo dieccezione e lasciare che il compilatore completi con ilcostruttore di default:

class MySimpleException extends Exception {}

Definiamone ora una piu ricca ...

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

La classe MyException

class MyException extends Exception {private int x;

// COSTRUTTORIpublic MyException() {}

public MyException(String msg) {super(msg);

}

public MyException(String msg, int x) {super(msg);this.x = x;

}

// METODIpublic int valore() {

return x;}

// metodo sovrascrittopublic String getMessage() {

return "Messaggio dettagliato: " + x + " " + super.getMessage();}

}

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Intercettare eccezioni

Se si e all’interno di un metodo e viene sollevata un’eccezione,si puo scegliere di:

lasciare che venga interrotta l’esecuzione del metodoevitando d’intercettare l’eccezione (delega al chiamante)catturare l’eccezione (blocco try ... catch)

try {/* Codice che puo’ generare eccezioni */

} catch(Tipo1 id1) {/* tratta l’eccezione di Tipo1 */

} catch(Tipo2 id2) {/* tratta l’eccezione di Tipo2 */

} catch(Tipo3 id3) {/* tratta l’eccezione di Tipo3 */

}

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

La clausola finally

Spesso si chiede di eseguire una porzione di codiceindipendentemente dal fatto che all’interno del blocco tryvenga sollevata un’eccezione oppure no

try {/* Codice che puo’ generare eccezioni */

} catch(Tipo1 id1) {/* tratta l’eccezione di Tipo1 */

} catch(Tipo2 id2) {/* tratta l’eccezione di Tipo2 */

} finally {/* esegui comunque */

}

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

L’eccezione EmergenzaException

class EmergenzaException extends Exception {

public EmergenzaException() {}

public EmergenzaException(String msg) {super(msg);

}}class Switch {

private boolean state = false;public void on() {

state = true;System.out.println("Acceso ...");

}public void off() {

state = false;System.out.println("Spento ...");

}}

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

La classe CentraleNucleare

public class CentraleNucleare {private static Switch reattore = new Switch();

public static void gestioneEnergia() throws EmergenzaException {// genera energia...throw new EmergenzaException();

}

public static void main(String[] args) {try {

// accendo il reattorereattore.on();// possibili eccezioni (anomalie potenziali)gestioneEnergia();// spengo il reattore (funzionamento normale)reattore.off();

} catch (EmergenzaException e) {System.out.println("Gambe levate!!!!!");reattore.off();

}}

}G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

La classe CentraleNucleare1

public class CentraleNucleare1 {private static Switch reattore = new Switch();

public static void gestioneEnergia() throws EmergenzaException {// genera energia...throw new ArithmeticException();

}

public static void main(String[] args) {try {

reattore.on(); // accendo il reattore// possibili eccezioni (anomalie potenziali)gestioneEnergia();

} catch (EmergenzaException e) {System.out.println("Gambe levate!!!!!");

} finally {// spengo il reattore (in tutti i casi)reattore.off();

}}

}

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Gerarchia eccezioni controllate

Object

Throwable

Exception

RunTimeException

Controllate

IOException

FileNotFoundException UnknownHostException

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Indice

1 Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Eccezioni in presenza di ereditarieta

Overriding dei metodi

Quando si sovrascrive un metodo, si possono sollevare solo leeccezioni controllate specificate nell’intestazione dei metodipresenti nella classe base (o un sottoinsieme). Questarestrizione e utile perche implica che il codice correttamentefunzionante per la classe base sia valido anche per oggettiderivati da sottoclassi

Un esempio errato ...class ClasseA {

public void f() throws MySimpleException {}}class ClasseB extends ClasseA {

public void f() throws MyException {}}

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Morale ...

... delle eccezioni

Un sistema per il trattamento delle eccezioni rappresentaun”’uscita di sicurezza” che consente di abbandonare ilflusso normale d’esecuzione quando si presenta unacondizione che il metodo corrente non e in grado di trattareUna linea guida nell’uso delle eccezione e il seguente:

non intercettare un’eccezione a meno che non si sappiacosa farne!(Progetto) definire eccezioni controllate per i casi in cui ci siaspetta di essere in grado di porre un rimedio al casoeccezionale(Progetto) usare quelle non controllate per errori diprogrammazionepurtroppo (o per fortuna!) non e sempre cosı “bianco onero”!

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Morale ...

... delle eccezioniUn sistema per il trattamento delle eccezioni rappresentaun”’uscita di sicurezza” che consente di abbandonare ilflusso normale d’esecuzione quando si presenta unacondizione che il metodo corrente non e in grado di trattare

Una linea guida nell’uso delle eccezione e il seguente:

non intercettare un’eccezione a meno che non si sappiacosa farne!(Progetto) definire eccezioni controllate per i casi in cui ci siaspetta di essere in grado di porre un rimedio al casoeccezionale(Progetto) usare quelle non controllate per errori diprogrammazionepurtroppo (o per fortuna!) non e sempre cosı “bianco onero”!

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Morale ...

... delle eccezioniUn sistema per il trattamento delle eccezioni rappresentaun”’uscita di sicurezza” che consente di abbandonare ilflusso normale d’esecuzione quando si presenta unacondizione che il metodo corrente non e in grado di trattareUna linea guida nell’uso delle eccezione e il seguente:

non intercettare un’eccezione a meno che non si sappiacosa farne!(Progetto) definire eccezioni controllate per i casi in cui ci siaspetta di essere in grado di porre un rimedio al casoeccezionale(Progetto) usare quelle non controllate per errori diprogrammazionepurtroppo (o per fortuna!) non e sempre cosı “bianco onero”!

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Morale ...

... delle eccezioniUn sistema per il trattamento delle eccezioni rappresentaun”’uscita di sicurezza” che consente di abbandonare ilflusso normale d’esecuzione quando si presenta unacondizione che il metodo corrente non e in grado di trattareUna linea guida nell’uso delle eccezione e il seguente:

non intercettare un’eccezione a meno che non si sappiacosa farne!

(Progetto) definire eccezioni controllate per i casi in cui ci siaspetta di essere in grado di porre un rimedio al casoeccezionale(Progetto) usare quelle non controllate per errori diprogrammazionepurtroppo (o per fortuna!) non e sempre cosı “bianco onero”!

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Morale ...

... delle eccezioniUn sistema per il trattamento delle eccezioni rappresentaun”’uscita di sicurezza” che consente di abbandonare ilflusso normale d’esecuzione quando si presenta unacondizione che il metodo corrente non e in grado di trattareUna linea guida nell’uso delle eccezione e il seguente:

non intercettare un’eccezione a meno che non si sappiacosa farne!(Progetto) definire eccezioni controllate per i casi in cui ci siaspetta di essere in grado di porre un rimedio al casoeccezionale

(Progetto) usare quelle non controllate per errori diprogrammazionepurtroppo (o per fortuna!) non e sempre cosı “bianco onero”!

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Morale ...

... delle eccezioniUn sistema per il trattamento delle eccezioni rappresentaun”’uscita di sicurezza” che consente di abbandonare ilflusso normale d’esecuzione quando si presenta unacondizione che il metodo corrente non e in grado di trattareUna linea guida nell’uso delle eccezione e il seguente:

non intercettare un’eccezione a meno che non si sappiacosa farne!(Progetto) definire eccezioni controllate per i casi in cui ci siaspetta di essere in grado di porre un rimedio al casoeccezionale(Progetto) usare quelle non controllate per errori diprogrammazione

purtroppo (o per fortuna!) non e sempre cosı “bianco onero”!

G. Grossi Lezione 12

Le eccezioniEccezioni runtime (non controllate)Eccezioni controllateEccezioni ed ereditarieta

Morale ...

... delle eccezioniUn sistema per il trattamento delle eccezioni rappresentaun”’uscita di sicurezza” che consente di abbandonare ilflusso normale d’esecuzione quando si presenta unacondizione che il metodo corrente non e in grado di trattareUna linea guida nell’uso delle eccezione e il seguente:

non intercettare un’eccezione a meno che non si sappiacosa farne!(Progetto) definire eccezioni controllate per i casi in cui ci siaspetta di essere in grado di porre un rimedio al casoeccezionale(Progetto) usare quelle non controllate per errori diprogrammazionepurtroppo (o per fortuna!) non e sempre cosı “bianco onero”!

G. Grossi Lezione 12