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
Posta un commento