Java 7: Multicatch

DOMANDA:

In un try/catch c'è modo di scrivere più eccezioni nello stesso catch evitando così codice ridondante nel caso di stesso comportamento?


RISPOSTA:

Fino a Java 6 succede una cosa alquanto scomoda nell'utilizzo del try/catch: quando ci troviamo di fronte ad un codice che ha lo stesso comportamento con diverse eccezioni, siamo costretti a dover ripetere lo stesso codice più volte dentro diversi catch.

Guardiamo nel dettaglio un esempio in cui posso avere due eccezioni a runtime: una NumberFormatException qualora inserisca in input un formato non compatibile con la conversione in int (ad esempio delle lettere), oppure una ArithmeticException qualora inserisca un numero non compreso nell'intervallo 0 e 5 (estremi esclusi):
package multicatch;

import java.util.Scanner;

public class OldCatch {
  public static void main(String args[]) {
    try {
      Scanner scanner = new Scanner(System.in);
      String number = scanner.next();
      scanner.close();
      
      int num = Integer.parseInt(number);
    
      if (num < 0 || num > 5)
        throw new ArithmeticException();
 
    } catch (NumberFormatException e) {
      e.printStackTrace();
    } catch (ArithmeticException e) {
      e.printStackTrace();
    }
  }
}

Per risolvere la ridondanza possiamo utilizzare uno stratagemma di questo tipo:
package multicatch;

import java.util.Scanner;

public class OldCatchAdvanced {
  public static void main(String args[]) {
    try {
      Scanner scanner = new Scanner(System.in);
      String number = scanner.next();
      scanner.close();

      int num = Integer.parseInt(number);

      if (num < 0 || num > 5)
        throw new ArithmeticException();

    } catch (Exception e) {
      if((e instanceof NumberFormatException) || (e instanceof ArithmeticException))
        e.printStackTrace();
      else
        throw new RuntimeException(e);
    }
  }
}
NOTA: Personalmente trovo questo stratagemma abbastanza "sporco" e ne sconsiglio l'utilizzo.


JAVA 7

Per fortuna, le problematiche dei programmatori Java non restano inascoltate e da Java 7 in poi è stato introdotto il multicatch.

Guardiamo come possiamo riscrivere il codice di sopra:
package multicatch;

import java.util.Scanner;

public class MultiCatch {
  public static void main(String args[]) {
    try {
      Scanner scanner = new Scanner(System.in);
      String number = scanner.next();
      scanner.close();

      int num = Integer.parseInt(number);
      
      if (num < 0 || num > 5)
        throw new ArithmeticException();

    } catch (NumberFormatException | ArithmeticException e) {
      e.printStackTrace();
    }
  }
}
Come è facile capire dall'esempio, qualora avessimo più eccezioni che scatenano comportamenti simili, basterà dividerle con un | (OR bit a bit), risolvendo così i problemi di ridondanza di codice. Negli esempi abbiamo utilizzato solo due eccezioni ma è possibile concatenarne quante vogliamo.



Commenti

Post popolari in questo blog

Arrotondamento e troncamento in Java

Eclipse: Shortcuts (scorciatoie) da tastiera

Strutture dati: List, Set, Map

Creare un eseguibile Java