Try e Catch

Tipi di dati ed eccezioni in Java

Jim White

Java Developer

Problemi in Java

  • Nelle app possono verificarsi problemi o errori
    • Per input errato
    • Per bug nel codice
    • Per circostanze impreviste
  • Questi problemi si chiamano eccezioni
    • Interrompono il normale flusso
  • Java lancia eccezioni
Tipi di dati ed eccezioni in Java

Esempio di eccezione

public static void main(String[] args) {
    ArrayList<String> allStars = new ArrayList<String>();
    allStars.add("Mays");
    allStars.add("Aaron");
    allStars.add("Ruth");
    String last = allStars.get(3); // This will cause an exception
    System.out.println(last);
}
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 3 out of 
bounds for length 3
Tipi di dati ed eccezioni in Java

Try

  • Avvolgi il codice che può generare eccezioni con un blocco try
    • "Prova questo codice e, se c’è un problema, passalo al catch"
try {
    // Istruzioni da eseguire e monitorare per eccezioni
}
Tipi di dati ed eccezioni in Java

Catch

  • Metti un blocco catch dopo il try
    • Funziona da handler per gestire l’eccezione
    • L’eccezione catturata è passata come parametro
  • I blocchi try/catch sono obbligatori per alcuni tipi di eccezioni
    • Opzionali per altri
try {
    // Istruzioni da eseguire e monitorare per eccezioni
} catch (<Exception type> <variable name>) {
    // Istruzioni da eseguire se si verifica un’eccezione
}
Tipi di dati ed eccezioni in Java

Catturare IndexOutOfBoundsException

try {
  ArrayList<String> allStars = new ArrayList<String>();
  allStars.add("Mays");
  allStars.add("Aaron");
  allStars.add("Ruth");
  String last = allStars.get(3); // Accessing an element that isn't there
  System.out.println(last);
} catch (IndexOutOfBoundsException e) {
  System.out.println("Ops - indice sbagliato");
}
Ops - indice sbagliato
Tipi di dati ed eccezioni in Java

Catch multipli

  • Usa più blocchi catch per gestire tipi diversi di eccezioni
  • Ogni catch ha il suo tipo di eccezione e la sua variabile
  • Quando si verifica un’eccezione, Java controlla i catch in ordine finché trova una corrispondenza
try {
    ArrayList<String> nums 
      = new ArrayList<String>();
    nums.add("one");
    String last = nums.get(0);
    Integer.valueOf(last);
    System.out.println(last);
} catch (IndexOutOfBoundsException eIndex) {
    System.out.println("Ops - indice sbagliato");
} catch (NumberFormatException eValueOf) {
    System.out.println(
      "Ops - String non è un numero");
}
Ops - String non è un numero
Tipi di dati ed eccezioni in Java

Catch "generico"

  • Usa catch (Exception variable){ } come catch generico
    • Gestisce qualsiasi eccezione non gestita dagli altri catch
try {
    // Codice da provare
} catch (IndexOutOfBoundsException eIndex) {
    System.out.println("Ops - indice sbagliato");
} catch (NumberFormatException eValueOf) {
    System.out.println("Ops - String non è un numero");
} catch (Exception e) { // Gestisce tutte le eccezioni tranne le due sopra
    System.out.println("È successo qualcosa di imprevisto");
}
Tipi di dati ed eccezioni in Java

Finally

  • Il codice in finally viene sempre eseguito
// Quando avviene un’eccezione
try {
    Integer.valueOf("one");
} catch (NumberFormatException eValueOf) {
    System.out.println("Ops");
} finally {
    System.out.println("Pulizia in corso");
}
Ops
Pulizia in corso

 

// Quando non viene lanciata alcuna eccezione
try {
    Integer.valueOf("1");
} catch (NumberFormatException eValueOf) {
    System.out.println("Ops");
} finally {
    System.out.println("Pulizia in corso");
}
Pulizia in corso
Tipi di dati ed eccezioni in Java

Oggetto Exception

  • L’oggetto Exception passato nel catch è ricco di info
  • Usa i suoi metodi per capire cosa è andato storto
    • .getMessage() per la causa leggibile
    • .getClass() per ottenere la classe o il tipo dell’eccezione
    • .printStackTrace() per mostrare lo stack trace (slide successiva)
public class ExceptionExample {

    public static void main(String[] args) {
        try {
            Integer.valueOf("one");
        } catch (NumberFormatException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }
    }
}
Tipi di dati ed eccezioni in Java

Stack trace dell’eccezione

  • Lo stack trace registra il flusso di esecuzione fino al problema
    • Sotto: output dell’esempio precedente, con lo stack trace stampato
For input string: "one"
java.lang.NumberFormatException: For input string: "one"
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
    at java.base/java.lang.Integer.parseInt(Integer.java:661)
    at java.base/java.lang.Integer.valueOf(Integer.java:988)
    at foo/exceptions.ExceptionExample.main(ExceptionExample.java:7)
Tipi di dati ed eccezioni in Java

Passons à la pratique !

Tipi di dati ed eccezioni in Java

Preparing Video For Download...