JavaRush /Java Blog /Random-IT /Eccezioni e loro gestione
articles
Livello 15

Eccezioni e loro gestione

Pubblicato nel gruppo Random-IT
Eccezioni o situazioni (stati) eccezionali sono errori che si verificano in un programma durante il suo funzionamento. Tutte le eccezioni in Java sono oggetti. Pertanto, possono essere generati non solo automaticamente quando si verifica una situazione eccezionale, ma anche creati dallo stesso sviluppatore. Gerarchia delle classi di eccezioni: Eccezioni e loro gestione - 1le eccezioni sono divise in diverse classi, ma tutte hanno un antenato comune: la classe Throwable. I suoi discendenti sono le sottoclassi Exceptione Error. Le eccezioni ( Exceptions) sono il risultato di problemi in un programma che sono, in linea di principio, risolvibili e prevedibili. Ad esempio, la divisione per zero è avvenuta tra numeri interi. Gli errori ( Errors) sono problemi più seri che le specifiche Java affermano che non dovresti tentare di gestire nel tuo programma perché sono problemi a livello di JVM. Ad esempio, eccezioni di questo tipo si verificano se la memoria a disposizione della macchina virtuale è esaurita. Il programma non sarà ancora in grado di fornire memoria aggiuntiva per la JVM. In Java, tutte le eccezioni sono divise in tre tipi: eccezioni verificate ( checked) ed eccezioni non verificate ( unchecked) che includono errori ( Errors) ed eccezioni di runtime ( RuntimeExceptionsdiscendente della classe Exception). Le eccezioni controllate sono errori che possono e devono essere gestiti in un programma; tutti i discendenti di una classe Exception(ma non RuntimeException) appartengono a questo tipo. La gestione delle eccezioni può essere eseguita utilizzando gli operatori try…catcho trasferita alla parte esterna del programma. Ad esempio, un metodo può passare eccezioni che si verificano al suo interno più in alto nella gerarchia delle chiamate senza gestirlo da solo. Le eccezioni non controllate non richiedono gestione, ma puoi gestire le eccezioni di classe se lo desideri RuntimeException. Compiliamo ed eseguiamo il seguente programma:

class Main { 
     public static void main(String[] args) { 
         int a = 4; 
         System.out.println(a/0); 
     } 
}
Una volta avviato, sulla console verrà visualizzato il seguente messaggio:

Exception in thread "main" java.lang.ArithmeticException: / by zero 
        at Main.main(Main.java:4)
Il messaggio mostra la classe dell'eccezione che si è verificata - ArithmeticException. Questa eccezione può essere gestita:

class Main { 
     public static void main(String[] args) { 
         int a = 4; 
         try { 
              System.out.println(a/0); 
         } catch (ArithmeticException e) { 
              System.out.println("Произошла недопустимая арифметическая операция"); 
         } 
     } 
}
Ora, invece di un messaggio di errore standard, verrà eseguito un blocco catch, il cui parametro è l'oggetto e della classe corrispondente all'eccezione (all'oggetto stesso può essere assegnato un nome qualsiasi, sarà necessario se vogliamo lanciare forzatamente nuovamente questa eccezione, ad esempio, in modo che venga controllata da qualche altro gestore). In questo caso il blocco trycontiene il frammento di programma in cui potrebbe potenzialmente verificarsi un'eccezione. Si trypossono corrispondere a più blocchi catch con classi di eccezione diverse.

import java.util.Scanner; 
class Main { 
    public static void main(String[] args) { 
     int[] m = {-1,0,1}; 
        Scanner sc = new Scanner(System.in); 
        try { 
            int a = sc.nextInt();     
            m[a] = 4/a; 
            System.out.println(m[a]); 
        } catch (ArithmeticException e) { 
            System.out.println("Произошла недопустимая арифметическая операция"); 
        } catch (ArrayIndexOutOfBoundsException e) { 
            System.out.println("Обращение по недопустимому индексу массива"); 
        } 
    } 
}
Se, dopo aver lanciato il programma presentato, l'utente accede dalla tastiera 1 o 2, il programma verrà eseguito senza creare eccezioni. Se l'utente inserisce 0, si verificherà un'eccezione di classe ArithmeticExceptione verrà gestita dal primo blocco catch. Se l'utente inserisce 3, si verificherà un'eccezione di classe ArrayIndexOutOfBoundsException(array fuori dai limiti) e verrà elaborata dal secondo blocco catch. Se l'utente inserisce un numero non intero, ad esempio 3.14, si verificherà un'eccezione di classe InputMismatchException(mancata corrispondenza del tipo di input) e verrà generata in formato errore standard, poiché non l'abbiamo gestita in alcun modo. Puoi, tuttavia, aggiungere un gestore per la classe Exception, poiché questa classe è la classe genitore per tutte le altre eccezioni controllate, ne catturerà qualcuna (inclusa InputMismatchException).

import java.util.Scanner; 
class Main { 
    public static void main(String[] args) { 
        int[] m = {-1,0,1}; 
        int a = 1; 
        Scanner sc = new Scanner(System.in);        
        try { 
            a = sc.nextInt();     
            m[a-1] = 4/a;
            System.out.println(m[a]); 
        } catch (ArithmeticException e) { 
            System.out.println("Произошла недопустимая арифметическая операция"); 
        } catch (ArrayIndexOutOfBoundsException e) { 
            System.out.println("Обращение по недопустимому индексу массива");       
        } catch (Exception e) { 
            System.out.println("Произошло ещё Howое-то исключение"); 
        } 
    } 
}
Poiché le eccezioni sono costruite su una gerarchia di classi e sottoclassi, dovresti prima provare a gestire le eccezioni più specifiche e solo dopo quelle più generali. Cioè, se posizionassimo il blocco con la gestione delle eccezioni della classe per primo (e non per terzo) Exception, non vedremmo mai alcun messaggio di errore diverso da "Si è verificata qualche altra eccezione" (tutte le eccezioni verrebbero catturate immediatamente da questo blocco e non raggiungerebbero il blocco riposo). Un'aggiunta facoltativa ai blocchi try…catchpuò essere un blocco finally. I comandi in esso inseriti verranno eseguiti in ogni caso, indipendentemente dal fatto che si verifichi o meno un'eccezione. Nonostante il fatto che quando si verifica un'eccezione non gestita, la parte del programma rimanente dopo la generazione di questa eccezione non viene eseguita. Ad esempio, se si è verificata un'eccezione durante alcuni calcoli lunghi, finallyè possibile visualizzare o salvare i risultati intermedi in un blocco. Link alla fonte: Eccezioni e loro gestione
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION