Visualizzazione dei risultati da 1 a 3 su 3

Discussione: JAVA: Exception???

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    493

    JAVA: Exception???

    A tutti.
    Frequento un corso di Java. Non mi è chiera la parte che riguarda l'intercettazione degli errori: try, catch, throw e finally .
    Qualcuno riuscirebbe in parole semplici a spiegarmele?
    Vi ringrazio moltissimo
    By

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Un'eccezione è un errore che può accadere durante una certa operazione. Prendiamo come esempio la conversione in un intero della rappresentazione stringa di un numero.

    Se io ho la rappresentazione del numero 25 in una stringa (significa che ho un oggetto String che mi rappresenta il 25 in questo modo: "25") e voglio far sì che tale valore mi venga inserito in una variabile di tipo int, devo ricorrere alla classe wrapper Integer, usando il metodo statico parseInt:
    codice:
    String mioNumero = "25";
    int nuemro = Integer.parseInt(mioNumero);
    Il problema sorge quando tento di convertire in intero una stringa che non mi rappresenta nessun numero:
    codice:
    String mioNumero = "Ciao!";
    int numero = Integer.parseInt(mioNumero);
    Cosa succede in questo caso? Viene generata un'eccezione. Il compilatore, non può sapere a priori quando questo succederà, perchè se la mia stringa viene inizializzata a tempo d'esecuzione, non so cosa verrà a contenere (un numero valido oppure no!). E qui nascono le ECCEZIONI: ci sono dei metodi che non possono sapere a priori se andranno a buon fine o no. In questi casi si costringe il programmatore ad intercettare i possibili errori.
    Per fare questo, si inseriscono tutte le istruzioni "potenzialmente pericolose" in un blocco try...catch:
    codice:
    String mioNumero = "25";
    try {
       int numero = Integer.parseInt(mioNumero);
    } catch (NumberFormatException nfe) {}
    Se l'istruzione (o una delle istruzioni nel blocco) non dovesse andare a buon fine, allora l'eccezione sollevata viene catturata dal blocco catch corrispondente.
    Nell'esempio precedente viene raccolta un'eccezione di tipo NumberFormatException (che è la particolare eccezione lanciata dal metodo parseInt(), in generale si può catturare qualsiasi eccezione semplicemente intercettandole con catch(Exception e) ).

    Quali sono i metodi che possono generare eccezioni: in generale TUTTI quei metodi che si occupano di I/O (le periferiche possono generare errori inaspettati!), poi le istruzioni che hanno a che fare con conversioni tra forme particolari di dati.

    Il programmatore di una classe, però, potrebbe non essere in teressato a catturare egli stesso l'eccezione, ma lasciare che sia il programmatore che la usa a doverlo fare. In questo caso si dichiara il metodo come "generatore di possibili eccezioni". Basta semplicemente aggiungere alal dichiarazione del metodo la parola chiave throws seguita dal tipo di eccezione che il metodo può lanciare. Supponiamo di voler realizzare una classe che converte una stringa in un intero e di non volerci preoccupare se viene lanciata un'eccezione:
    codice:
    public int converti(String numero) throws NumberFormatException {
       return Integer.parseInt(numero);
    }
    Il programmatore che userà la nostra classe DOVRA' racchiudere il metodo converti() in un blocco try...catch.

    Supponiamo, ora, di voler definire una nostra eccezione e di lanciarla (perchè ci piace così!):
    codice:
    public int converti(String numero) throws NostraEccezioneNumerica {
       int numeroNuovo = 0;
       try {
          numeroNuovo = Integer.parseInt(numero);
       } catch (Exception e) {
          throw new NostraEccezioneNumerica();
       }
       return numeroNuovo;
    }
    Ora siamo noi a lanciare forzatamente un'eccezione. (E' chiaro che dovremo definire una classe NostraEccezioneNumerica che estende Exception o Throwable, per poterlo fare).

    In ogni caso, la gestione delle eccezioni è nua parte fondamentale della programmazione OO (e non). Se non vogliamo che il nostro programma vada in crash appena qualcosa va storto (a causa dell'utente o a causa del S.O.) dobbiamo preoccuparci di gestirle per fornire, magari, anche un messaggio d'errore, che spieghi cosa è accaduto.

    Il blocco finally serve per terminare un blocco try...catch: supponiamo che il nostro metodo debba aprire un file, poi scrivere il contenuto di un array al suo interno. Può succedere che l'apertura vada a buon fine, ma che scrivendo la nostra classe, noi non abbiamo tenuto conto di un possibile errore: lo sconfinamento dell'array! Cosa accade: viene aperto il file, vengono scritte tutte le informazioni dell'array, poi si tenta di accedere ad un elemento dell'array INESISTENTE, viene lanciata un'eccezione di tipo ArrayIndexOutOfBoundsException.
    Ebbene: il nostro metodo cattura l'eccezione, non la guarda, passa oltre (si può fare!)... IL FILE RIMANE APERTO!!!
    In questi casi si usa la clausola finally per inserire tutte le istruzioni che si vogliono vengano eseguite, anche se prima è sorta un'eccezione (la chiusura del file, nel caso sia stato aperto!).

    Una cosa devo aggiungere: è possibile catturare DIVERSI TIPI di eccezioni:
    codice:
    try {
       // apro il file: posso avere un'eccezione di I/O
       // scrivo l'array: posso avere lo sconfinamento
       // chiudo il file (non si farebbe qui, ma nel finally)
    } catch (IOException ioe) {
       ... // faccio qualcosa
    } catch (ArrayIndexOutOfBoundsException aioobe) {
       ... // faccio qualcos'altro
    } finally {
       ... // controllo e faccio altro
    }
    Lo so... la chiarezza non è il mio forte... ma faccio del mio meglio! :gren:


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2003
    Messaggi
    493
    GRAZIE MILLE LeleFT
    oltre ad essere molto gentile sei sttao molto ma molto chiaro. Chiaro e sintetico.
    Ancora Grazie!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.