Eccezioni

di il
5 risposte

Eccezioni

Buongiorno a tutti.

sto iniziando la programmazione in java e volevo chiedervi dei chiarimenti riguardo le eccezioni.

In particolare ho le idee confuse tra :

try - catch

oppure dichiarare una funzione e aggiungere throws eccezionex

oppure dichiarare una funzione , aggiungere throws e all'interno della funzione mettere throw new...

grazie a tutti

5 Risposte

  • Re: Eccezioni

    L'esecuzione di alcune cose può potenzialmente portare dei problemi. Questi problemi sono detti "eccezioni".

    Un metodo che esegue delle istruzioni "potenzialmente pericolose" può decidere di fare 3 cose:

    1) Gestire completamente queste situazioni
    2) Fregarsene altamente e delegare al suo chiamante l'onere di gestirle
    3) Gestire alcune situazioni e delegare l'onere al chiamante di gestirne altre

    Il costrutto try/catch serve a gestire una o più eccezioni:
    
    try {
       ... // Istruzioni "pericolose"
    } catch (Eccezione1 e1) {
       ... // Gestisco la problematica numero 1
    } catch (Eccezione2 e2) {
       ... // Gestisco la problematica numero 2
    }
    
    Se tutte le situazioni pericolose sono gestite tramite l'apposita sezione catch(), il metodo è "sicuro": non può accadere nulla che lui non sia in grado di gestire.

    Se, al contrario, il metodo non vuole (o non può) gestire le eccezioni, allora dichiara di poterne sollevare e sarà compito di chi lo chiama gestirle (o passarle a sua volta). In questo caso, il metodo farà uso della clausola throws.

    Può esserci il caso in cui il metodo sia in grado di gestire alcune eccezioni, ma non altre che possono sollevarsi (o, addirittura, può egli stesso sollevarne in caso vi siano problemi sui dati). In questo caso, il metodo dovrà dichiarare le eccezioni che non intende (o non può) gestire, mentre dovrà gestore con try/catch il resto.

    L'istruzione throw serve a sollevare un'eccezione. Se, ad esempio, un metodo deve lavorare con determinati dati, ma questi dati sono errati, può di sua iniziativa sollevare un'eccezione (che va dichiarata!) usando appunto l'istruzione throw.

    La regola fondamentale, comunque, rimane sempre la stessa. Quando ci sono di mezzo istruzioni pericolose, quindi ci sono in ballo le eccezioni, il metodo che esegue le istruzioni pericolose deve decidere una delle seguenti due cose:

    1) Gestire le eccezioni (try/catch)

    oppure

    2) Delegare al chiamante (throws)


    Ciao.
  • Re: Eccezioni

    Ciao,

    ti ringrazio sei stato molto chiaro. Ho solo un dubbio.

    Quando dici :

    LeleFT ha scritto:


    Se, al contrario, il metodo non vuole (o non può) gestire le eccezioni, allora dichiara di poterne sollevare e sarà compito di chi lo chiama gestirle (o passarle a sua volta).
    Questo continuo passaggio fino a dove puo continuare? prima o poi dovro gestirla no?
  • Re: Eccezioni

    mydb ha scritto:


    LeleFT ha scritto:


    Se, al contrario, il metodo non vuole (o non può) gestire le eccezioni, allora dichiara di poterne sollevare e sarà compito di chi lo chiama gestirle (o passarle a sua volta).
    Questo continuo passaggio fino a dove puo continuare? prima o poi dovro gestirla no?
    Questo continuo passaggio può continuare fino all'inizio della catena di chiamate, ovvero, fino a raggiungere il punto di avvio del programma (il metodo main). Anche il metodo main può "infischiarsene" e dichiarare (tramite clausola throws) le eccezioni. In questo caso saranno eventualmente raccolte dalla JVM che, semplicemente, ne stamperà lo stack-trace e terminerà, non avendo nessun modo per gestirle. L'effetto, ovviamente, è la terminazione anomala del programma.


    Ciao.
  • Re: Eccezioni

    Un esempio di catena, raccolta dalla JVM:
    
    public class CatenaEccezioni {
       public static void main(String[] args) throws Exception {
          // Qui dovrei usare un try/catch perchè il metodo può sollevare
          // eccezioni... ma non ne ho voglia: le delego alla JVM
          metodo1();
       }
    
       private static void metodo1() throws Exception {
          // So che questo metodo può sollevare eccezioni, ma
          // non ho voglia di gestirle, le delego al chiamante
          metodo2();
       }
    
       private static void metodo2() throws Exception {
          // Questo metodo può sollevare eccezioni, ma io non sono
          // in grado di gestirle, allora delego al chiamante
          metodo3();
       }
    
       private static void metodo3() throws Exception {
          // Questo metodo solleva un'eccezione e, giustamente, la dichiara
          throw new IllegalStateException("E' successo qualcosa di anomalo...");
       }
    }
    
    Il risultato dell'esecuzione:
    
    Exception in thread "main" java.lang.IllegalStateException: E' successo qualcosa di anomalo...
            at CatenaEccezioni.metodo3(CatenaEccezioni.java:22)
            at CatenaEccezioni.metodo2(CatenaEccezioni.java:17)
            at CatenaEccezioni.metodo1(CatenaEccezioni.java:11)
            at CatenaEccezioni.main(CatenaEccezioni.java:5)
    
    Ciao.
  • Re: Eccezioni

    Grazie
Devi accedere o registrarti per scrivere nel forum
5 risposte