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