Cenni sulle eccezioni.


Java Sun

Earthweb
(ex Gamelan)

Jars

Java Boutique

JavaWorld

PIP






  JSem: 5.1

   Le eccezioni in Java sono un modo chiaro per controllare gli errori senza inficiare il codice principale con innumerevoli istruzioni di controllo.
Le eccezioni sono generate dal sistema di esecuzione Java quando incontra errori nel caricamento di classi o nell'esecuzione dei loro metodi. Il sistema di esecuzione lancia queste eccezioni all'esecuzione. Le eccezioni in fase di esecuzione sono eccezioni non controllate ("unchecked"). Le eccezioni possono anche essere lanciate dal codice (con l'istruzione throw), questo succede quando il codice individua una situazione che potrebbe portare ad un disfunzionamento (per esempio mentre si cerca di caricare un'immagine da un URL, l'immagine potrebbe non essere più disponibile o l'indirizzo dell'URL potrebbe essere sbagliato). In questo caso si parla di eccezione controllata.

   Le eccezioni in Java sono degli oggetti (della classe Throwable di java.lang e sottoclassi tra cui Error, Exception, vedere la doc).
Le eccezioni devono essere catturate (ed eventualmente gestite), altrimenti si ottiene un errore. E' comunque preferibile un programma che, in caso di errore, vada avanti, magari solo per comunicare che c'è stato un errore, piuttosto che un programma che si pianta senza nessuna spiegazione!

   L'approccio generale è il seguente:

  • i blocchi di codice per i quali si prevede una gestione delle eccezioni sono messi in un'istruzione try


  • L'istruzione try contiene una clausola catch che cattura l'eccezione. Dopo un try ci possono essere varie clausole catch dipendenti da vari tipi di eccezioni.


  • Conclude il tutto una clausola, facoltativa, finally (che sarà comunque sempre eseguita).


  • Una volta conclusa la gestione delle eccezioni, il programma va all'istruzione successiva all'istruzione try.

       Come già detto, il programma può lanciare delle eccezioni con l'istruzione throw:

    throw qualcosa
    dove qualcosa deve essere un'istanza della classe java.lang.Throwable (è consigliato lanciare solo oggetti di sottoclassi di Exception), per esempio:
    throw new EsempioException();
    L'operatore new istanzia un oggetto della classe EsempioException che viene poi lanciato tramite throw.
    Invece la clausola throws (con la s) di un metodo indica il tipo di eccezione che potrebbe essere lanciata durante l'esecuzione del metodo:
    public void esempioMetodo() throws EsempioException{
    throw new EsempioException();
    }

       Per concludere facciamo un esempio semplice. Una delle eccezioni più frequente è ArrayIndexOutOfBoundsException: se si definisce un array:
    int[] arr = new int[3];
    e poi più avanti, si digita:
    int x = arr[3];
    si ottiene un'ArrayIndexOutOfBoundsException in quanto arr[3] non esiste (il suo indice è fuori dai limiti), infatti siccome si parte da 0, abbiamo solo arr[0], arr[1], arr[2]. Vediamo come gestire una tale eccezione. Consideriamo il seguente programma:

    class Password_0{
    
    public static void main(String[] arg){
    
    String conto = "Il numero del conto e': 00002";
    String pwd = "Autorizzato";
    if(arg[0].equals(pwd)){
    	System.out.print(conto);
    	}
        }
    }

    Compilare questo file "Password_0.java", dopodichè eseguire dalla riga di comando del DOS (non con UltraEdit o simili) nel modo seguente:
    >c:\jdk1.2.1\bin\java Password_0 Autorizzato
    (si assume che il jdk sia la versione 1.2.1, situato in c:)
    comparirà sullo schermo la scritta:
    Il numero del conto e': 00002
    Tra parentesi questo significa che è possibile passare degli argomenti ad un programma Java dalla riga dei comandi.
    Adesso provate ad eseguire normalmente, cioè:
    >c:\jdk1.2.1\bin\java Password_0
    compare sullo schermo un messaggio di errore, un'ArrayIndexOutOfBoundsException appunto. Infatti il programma aspetta che l'utente inserisca arg[0]. Per spiegare all'utente cosa deve fare, dobbiamo gestire questa eccezione, per esempio:

    class Password{
    
    public static void main(String[] arg){
    
    String conto = "Il numero del conto e': 00002";
    String pwd = "Autorizzato";
    String denied = "Password sbagliata!";
    String att = "Inserisci la password!";
    String input;
    
    try{input = arg[0];}
    catch(ArrayIndexOutOfBoundsException e){
    	input = att;
    }
    
    if(input.equals(pwd)){
    	System.out.print(conto);
    	}
    else if(input.equals(att)){
    	System.out.print(att);
    	}
    else{
    	System.out.print(denied);
    	}
    	}
    }

    Provate adesso ad eseguire questo programma dalla riga di comandi del DOS in vari modi (senza password, con password sbagliata, con password giusta). Osserviamo, en passant, che questo è un modo, abbastanza sicuro (tolto il file .java, ci vuole un decompilatore per leggere il file .class), per tenere dati segreti sul proprio computer.
    Un altro tipo di eccezione frequente è NullPointerException, provocata dal tentativo di fare riferimento ad un oggetto null.
    Nel seguito (threads) avremo occasione di incontrare varie gestioni delle eccezioni.




     next		content		previous