Antes de Java 7, teníamos que capturar solo un tipo de excepción en cada bloque catch. Entonces, cada vez que necesitábamos manejar más de una excepción específica pero tomar alguna acción para todas las excepciones, teníamos que tener más de un bloque catch que contuviera el mismo código.
En el siguiente código, tenemos que manejar dos excepciones diferentes pero realizar la misma acción para ambas. Así que necesitábamos tener dos bloques catch diferentes a partir de Java 6.0.
Java
// A Java program to demonstrate that we needed // multiple catch blocks for multiple exceptions // prior to Java 7 import java.util.Scanner; public class Test { public static void main(String args[]) { Scanner scn = new Scanner(System.in); try { int n = Integer.parseInt(scn.nextLine()); if (99%n == 0) System.out.println(n + " is a factor of 99"); } catch (ArithmeticException ex) { System.out.println("Arithmetic " + ex); } catch (NumberFormatException ex) { System.out.println("Number Format Exception " + ex); } } }
Entrada 1:
GeeksforGeeks
Salida 1:
Exception encountered java.lang.NumberFormatException: For input string: "GeeksforGeeks"
Entrada 2:
0
Salida 2:
Arithmetic Exception encountered java.lang.ArithmeticException: / by zero
Bloque de captura múltiple en Java
A partir de Java 7.0, es posible que un solo bloque catch capture varias excepciones separando cada una con | (símbolo de tubería) en el bloque catch.
La captura de múltiples excepciones en un solo bloque catch reduce la duplicación de código y aumenta la eficiencia. El código de bytes generado al compilar este programa será más pequeño que el programa que tiene múltiples bloques catch ya que no hay redundancia de código.
Nota: si un bloque catch maneja varias excepciones, el parámetro catch es implícitamente final. Esto significa que no podemos asignar ningún valor a los parámetros de captura.
Sintaxis:
try { // code } catch (ExceptionType1 | Exceptiontype2 ex){ // catch block }
Diagrama de flujo del bloque de captura múltiple de Java
Java
// A Java program to demonstrate // multicatch feature import java.util.Scanner; public class Test { public static void main(String args[]) { Scanner scn = new Scanner(System.in); try { int n = Integer.parseInt(scn.nextLine()); if (99%n == 0) System.out.println(n + " is a factor of 99"); } catch (NumberFormatException | ArithmeticException ex) { System.out.println("Exception encountered " + ex); } } }
Entrada 1:
GeeksforGeeks
Salida 1:
Exception encountered java.lang.NumberFormatException: For input string: "GeeksforGeeks"
Entrada 2:
0
Salida 2:
Exception encountered java.lang.ArithmeticException: / by zero
Un bloque catch que maneja múltiples tipos de excepción no crea duplicación en el código de bytes generado por el compilador. Es decir, el código de bytes no tiene replicación de controladores de excepción.
Puntos importantes:
1. Si todas las excepciones pertenecen a la misma jerarquía de clases, deberíamos capturar el tipo de excepción base. Sin embargo, para capturar cada excepción, debe hacerse por separado en sus bloques catch.
2. Un solo bloque catch puede manejar más de un tipo de excepción. Sin embargo, las excepciones de clase base (o ancestro) y subclase (o descendiente) no se pueden capturar en una declaración. Por ejemplo
// Not Valid as Exception is an ancestor of // NumberFormatException catch(NumberFormatException | Exception ex)
3. Todas las excepciones deben estar separadas por tubo de barra vertical | .
Este artículo es una contribución de Aparna Vadlamani . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo y enviarlo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA