English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 基礎教程

Controllo dei flussi di Java

Array di Java

Orientamento ad oggetti in Java (I)

Orientamento ad oggetti in Java (II)

Orientamento ad oggetti in Java (III)

Java 异常处理

Liste di Java

Queue (coda) di Java

Map collection di Java

Set collection di Java

Input/Output (I/O) di Java

Reader/Writer di Java

Altri argomenti di Java

Gestione e cattura di più eccezioni in Java

In questo tutorial, impareremo come gestire più eccezioni in Java con esempi.

Prima di Java 7, anche se c'era ridondanza nel codice, dovevamo scrivere più codici di gestione delle eccezioni per diversi tipi di eccezioni.

Facciamo un esempio.

Esempio 1: Più blocchi di cattura

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10] = 30 / 0;
    }
      System.out.println(e.getMessage());
    }
      System.out.println(e.getMessage());
    } 
  }
}

Risultato di output

/ da zero

In questo esempio possono verificarsi due eccezioni:

  • ArithmeticException - poiché abbiamo cercato di dividere un numero per zero.

  • ArrayIndexOutOfBoundsException - poiché abbiamo dichiarato un nuovo array di interi con bound da 0 a 9 e abbiamo cercato di assegnare un valore all'indice 10.

Stampiamo i messaggi di eccezione in entrambi i blocchi catch, che è codice ripetuto.

L'associatività dell'operatore di assegnazione (=) è da destra a sinistra, quindi viene prima lanciata ArithmeticException con il messaggio / by zero.

Gestire più eccezioni nel blocco catch

In Java SE 7 e versioni successive, possiamo ora catturare più tipi di eccezioni in un singolo blocco catch.

Ogni tipo di eccezione che può essere gestita dal blocco catch è separato da un trattino verticale (|).

La sintassi è:

try {
  // codice
} 
  // blocco catch
}

Esempio 2: Cattura più eccezioni in un singolo blocco catch

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10] = 30 / 0;
    }
      System.out.println(e.getMessage());
    }
  }
}

Risultato di output

/ da zero

Catturare più eccezioni in un singolo blocco catch può ridurre la ripetizione del codice e migliorare l'efficienza.

Il bytecode generato dalla compilazione di questo programma sarà più piccolo rispetto a quello di un programma con più blocchi catch, poiché non ci sono code ridondanti.

Attenzione:Se un blocco catch gestisce più eccezioni, il parametro catch è implicitamente final. Questo significa che non possiamo assegnare alcun valore al parametro di cattura.

Cattura l'eccezione base

Quando si catturano più eccezioni in un singolo blocco catch, questa regola si generalizza alla regola specializzata.

Questo significa che, se esiste una gerarchia di eccezioni nel blocco catch, possiamo catturare solo l'eccezione base e non più eccezioni specializzate.

Facciamo un esempio.

Esempio 3: Cattura solo l'eccezione base

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10] = 30 / 0;
    }
      System.out.println(e.getMessage());
    }
  }
}

Risultato di output

/ da zero

Sappiamo che tutte le classi di eccezione sono sottoclasse di Exception. Pertanto, non dobbiamo catturare più eccezioni specializzate, ma solo Exception.

Se hai già specificato il tipo di eccezione base nel blocco catch, non usare le sottoclassi di eccezione nello stesso blocco catch. Altrimenti, otterremo un errore di compilazione.

Facciamo un esempio.

Esempio 4: Cattura della classe base e delle sottoclasse di eccezione

class Main {
  public static void main(String[] args) {
    try {
      int array[] = new int[10];
      array[10] = 30 / 0;
    } catch (Exception | ArithmeticException | ArrayIndexOutOfBoundsException e) {
      System.out.println(e.getMessage());
    }
  }
}

Risultato di output

Main.java:6: errore: le alternative in una dichiarazione multi-catch non possono essere collegate per sottoclasse

In questo esempio, ArithmeticException e ArrayIndexOutOfBoundsException sono sottoclasse di Exception. Pertanto, lanciamo un errore di compilazione.