[Corsopoc] info generali per esonero

Andrea De Santis dsa@arealazio.com
Fri, 24 Jan 2003 20:09:43 +0100


Hi!

> 2)(entriamo più nello specifico) un metodo che ipoteticamente sollevi più
> eccezioni può avere una segnatura del genere?
>   public void metodo1() throws Exception1, Exception2 {...}
> ovvero: può un metodo sollevare più eccezioni e se si, è questo con le
> virgole il modo corretto di segnalarlo?

Dal manuale java leggo:
tipo nome (argomenti) throws tipo_Throwable,{[Tipo_Throwable]}
{
}

Quindi suppongo di si, ad ogni modo se specifichi "throws Exception" di
fatto
riesci a propagare qualsiasi eccesione. (vedi programmino sotto)


[cut]
>Il mio dubbio a questo punto è: ma throws serve a
> dire semplicemente che questo metodo potrà sollevare un'eccezione, oppure
>a
> farmi capire che tale eccezione sollevata verrà poi propagata, ovvero
> gestita dal chiamante?

Significa appunto che può  *propagare* l'eccezione! Non è detto che
la generi anche... potrebbe anche essere stata generata da un altro
metodo usato internamente, che a sua volta ha la facoltà di propagare
eccezioni.
X essere + chiaro, vedi il programmino sotto: se il valore passato al metodo
divnumero
è diverso da 5 allora viene richiamato il metodo GeneraErrore che effettua
una
divisione per zero e quindi genera l'eccezione (ArithmeticException: / by
zero).
 Quest'ultima viene quindi propagata
al metodo divnumero il quale a sua volta la propaga fino al catch che è
finalmente in grado di gestirla!
Se invece il numero passato è uguale a 5, allora viene *sollevata* una
eccezione
definita dal programmatore (e quindi *propagata*...)

>in quest'ultimo caso il chiamante deputato a gestirla
> chi dovrebbe essere, l'istruzione catch che segue il blocco try da cui si
>è
> sollevata l'eccezione? (mi raccomando,occhio ai termini "sollevare" e
> "propagare", hanno una sottile ma sostanziale differenza...)

Esatto!

-----------------------------------------------------------------------
Bruttissimo ma funziona :)
-----------------------------------------------------------------------

class Errore1 extends Exception{
    public Errore1(int numero) {
        super("Attenzione, valore non valido! "+numero);
    }
}


class prova1 {

    int numero;
    public void divnumero(int num) throws Exception {

        if(num == 5){
         throw new Errore1(5);
        }
        else
        {
         this.GeneraErrore();
        }

    }

    public void GeneraErrore() throws Exception
    {
        numero=15/0;
    }

}


public class eccezioni {


    public static void main(String args[]) {
        prova1 esempio=new prova1();
        try {
            esempio.divnumero(4);
        }
        catch(Exception _e) {
            System.out.println(_e.toString());
        }
    }
}