Vai al contenuto

Gestione delle eccezioni

In questa lezione impari a

  • capire cosa sono le eccezioni
  • usare try-catch-finally
  • tipi di eccezioni in Java
  • lanciare eccezioni con throw
  • creare eccezioni personalizzate

Cos'è un'eccezione?

Un'eccezione è un evento anomalo che interrompe il normale flusso del programma.

Esempi: divisione per zero, file non trovato, array fuori bounds, etc.

Try-Catch base

public class EsempioEccezione {
    public static void main(String[] args) {
        try {
            // Codice che potrebbe generare un'eccezione
            int risultato = 10 / 0;  // Divisione per zero!
            System.out.println("Risultato: " + risultato);
        } catch (ArithmeticException e) {
            // Gestisco l'eccezione
            System.out.println("Errore: divisione per zero!");
            System.out.println("Messaggio: " + e.getMessage());
        }
        
        System.out.println("Programma continua...");
    }
}
Errore: divisione per zero!
Messaggio: / by zero
Programma continua...

Try-Catch-Finally

public class TestFile {
    public static void main(String[] args) {
        try {
            int[] numeri = {1, 2, 3};
            System.out.println(numeri[5]);  // Fuori dai limiti!
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("Indice non valido!");
        } finally {
            // Eseguito SEMPRE, anche se c'è un'eccezione
            System.out.println("Blocco finally eseguito");
        }
        
        System.out.println("Fine programma");
    }
}

Eccezioni comuni

Eccezione Quando si verifica
NullPointerException Uso di oggetto null
ArrayIndexOutOfBoundsException Indice array non valido
ArithmeticException Operazione matematica illegale
NumberFormatException Conversione stringa-numero fallita
FileNotFoundException File non trovato

Catch multipli

public class MultiCatch {
    public static void main(String[] args) {
        String input = "abc";
        
        try {
            int numero = Integer.parseInt(input);
            int risultato = 100 / numero;
            System.out.println("Risultato: " + risultato);
        } catch (NumberFormatException e) {
            System.out.println("Formato numero non valido!");
        } catch (ArithmeticException e) {
            System.out.println("Divisione per zero!");
        } catch (Exception e) {
            // Catch generico alla fine
            System.out.println("Errore generico: " + e.getMessage());
        }
    }
}

Lanciare eccezioni

public class ContoBancario {
    private double saldo;
    
    public ContoBancario(double saldoIniziale) {
        if (saldoIniziale < 0) {
            throw new IllegalArgumentException("Saldo iniziale negativo!");
        }
        this.saldo = saldoIniziale;
    }
    
    public void preleva(double importo) throws Exception {
        if (importo > saldo) {
            throw new Exception("Fondi insufficienti!");
        }
        saldo -= importo;
    }
}

// Uso
try {
    ContoBancario conto = new ContoBancario(100);
    conto.preleva(150);
} catch (Exception e) {
    System.out.println("Errore: " + e.getMessage());
}

Esercizi

⭐ Facile

Esercizio 1 – Calcolatrice sicura.

Crea una calcolatrice che gestisce divisione per zero

⭐⭐ Medio

Esercizio 2 – validazione input.

Metodo che verifica età (0-120) e lancia eccezione se invalida

Concetti chiave

  • try-catch per gestire eccezioni
  • finally eseguito sempre
  • throw per lanciare eccezioni
  • throws nella firma del metodo
  • Gestisci eccezioni specifiche prima di quelle generiche