Error e Exception

Tags
Published
Author

Gli errori di esecuzione in Java

Gli errori di esecuzione sono eventi che si verificano quando un programma viene eseguito e non riesce a completare la sua operazione correttamente.
Questi errori sono tipicamente causati da condizioni anomale che si verificano durante l'esecuzione, come il tentativo di accedere a una risorsa non disponibile, l'accesso a variabili non inizializzate, o l'uso di dati in modo non valido.

Cos'è un errore di esecuzione?

Un errore di esecuzione si verifica quando il programma è sintatticamente corretto e compila senza errori, ma incontrando una condizione imprevista o anomala durante l'esecuzione che impedisce il normale funzionamento. Gli errori di esecuzione possono portare a un comportamento imprevisto, ad esempio l'arresto del programma, la corruzione dei dati o il fallimento di un'operazione.

Tipi di errori di esecuzione in Java

In Java, gli errori di esecuzione vengono generalmente suddivisi in due categorie principali:
  1. Errori (Errors): Si riferiscono a problemi gravi che si verificano durante l'esecuzione, come errori di sistema o problemi di memoria. Gli errori sono solitamente al di fuori del controllo del programma e non possono essere facilmente gestiti. Un esempio comune è l'OutOfMemoryError.
  1. Eccezioni (Exceptions): Si riferiscono a condizioni anomale che possono essere gestite dal programma. Le eccezioni sono eventi che possono essere catturati e trattati utilizzando strutture di gestione delle eccezioni come try-catch.

Errori di esecuzione più comuni in Java

1. NullPointerException

Il NullPointerException è uno degli errori di esecuzione più comuni in Java. Si verifica quando si tenta di utilizzare un oggetto che è null, come chiamare un metodo su un oggetto non inizializzato o accedere a un campo di un oggetto null.
Esempio:
public class NullPointerExample { public static void main(String[] args) { String nome = null; System.out.println(nome.length()); // Lancia NullPointerException } }
In questo esempio, il programma tenta di chiamare il metodo length() su un oggetto String che è null. Poiché non è stato creato nessun oggetto, si verifica una NullPointerException.

2. ArrayIndexOutOfBoundsException

L'ArrayIndexOutOfBoundsException si verifica quando si tenta di accedere a un elemento di un array utilizzando un indice che è fuori dai limiti validi dell'array.
Esempio:
public class ArrayIndexExample { public static void main(String[] args) { int[] numeri = {1, 2, 3}; System.out.println(numeri[5]); // Lancia ArrayIndexOutOfBoundsException } }
In questo esempio, si tenta di accedere all'indice 5 di un array che ha solo 3 elementi. Questo causa una ArrayIndexOutOfBoundsException.

3. ArithmeticException

L'ArithmeticException si verifica quando si tenta di eseguire un'operazione aritmetica che non è valida, come la divisione per zero.
Esempio:
public class ArithmeticExample { public static void main(String[] args) { int risultato = 10 / 0; // Lancia ArithmeticException } }
In questo esempio, si tenta di dividere 10 per 0, il che provoca una ArithmeticException.

4. ClassCastException

La ClassCastException si verifica quando si tenta di fare un cast tra tipi incompatibili. Ad esempio, se si tenta di fare un cast di un oggetto di una classe in un'altra classe che non è una sua sottoclasse, si verifica questo errore.
Esempio:
public class ClassCastExample { public static void main(String[] args) { Object obj = "Ciao"; Integer numero = (Integer) obj; // Lancia ClassCastException } }
In questo esempio, si tenta di fare un cast di un oggetto String in un tipo Integer, che non è compatibile, provocando una ClassCastException.

5. StackOverflowError

Un StackOverflowError si verifica quando il programma esegue una ricorsione troppo profonda e la pila di esecuzione del programma esaurisce la memoria disponibile.
Esempio:
public class StackOverflowExample { public static void main(String[] args) { chiamataRicorsiva(); } public static void chiamataRicorsiva() { chiamataRicorsiva(); // Chiamata ricorsiva infinita } }
In questo esempio, la funzione chiamataRicorsiva() chiama se stessa senza una condizione di terminazione, portando a una StackOverflowError.

Gestire gli errori di esecuzione in Java

In Java, Le eccezioni possono essere gestite tramite i blocchi try-catch e, se necessario, è possibile lanciare eccezioni personalizzate per gestire condizioni particolari.

Blocco try-catch

Il blocco try-catch viene utilizzato per intercettare le eccezioni durante l'esecuzione di un programma. Il codice che potrebbe causare un errore viene inserito all'interno del blocco try, mentre il codice che gestisce l'errore viene messo nel blocco catch.
Esempio di gestione dell'eccezione ArithmeticException:
public class GestioneEccezione { public static void main(String[] args) { try { int risultato = 10 / 0; // Potenziale errore } catch (ArithmeticException e) { System.out.println("Errore: Divisione per zero!"); } } }
In questo esempio, il programma cerca di eseguire una divisione per zero, ma l'errore viene catturato nel blocco catch, evitando che il programma si arresti inaspettatamente.

Lanciare eccezioni personalizzate

In alcune situazioni, può essere utile lanciare eccezioni personalizzate per gestire casi particolari in modo più preciso. Questo può essere fatto utilizzando il comando throw.
Esempio di lancio di un'eccezione personalizzata:
public class EccezionePersonalizzata { public static void main(String[] args) { try { validaNumero(0); // Numero non valido } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); } } public static void validaNumero(int numero) { if (numero <= 0) { throw new IllegalArgumentException("Il numero deve essere maggiore di zero!"); } } }
In questo esempio, viene lanciata un'eccezione IllegalArgumentException con un messaggio personalizzato se il numero passato alla funzione non è valido.

Back to →
🐚
Java