在Java7之前,我们必须在每个catch块中只捕获一种异常类型。因此,每当我们需要处理多个特定异常,但对所有异常都采取一些操作时,我们必须有多个包含相同代码的catch块。
在下面的代码中,我们必须处理两个不同的异常,但对这两个异常采取相同的操作。因此,从Java6.0开始,我们需要有两个不同的catch块。
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); } } } |
输入1:
GeeksforGeeks
产出1:
Exception encountered java.lang.NumberFormatException: For input string: "GeeksforGeeks"
输入2:
0
产出2:
Arithmetic Exception encountered java.lang.ArithmeticException: / by zero
Java中的多捕获块
从Java 7.0开始,单个catch块可以通过在catch块中用|(管道符号)分隔每个异常来捕获多个异常。
在单个catch块中捕获多个异常可以减少代码重复并提高效率。编译该程序时生成的字节码将小于具有多个catch块的程序,因为没有代码冗余。
注: 如果catch块处理多个异常,则catch参数是隐式final。这意味着我们不能为捕捉参数分配任何值。
语法:
try { // code} catch (ExceptionType1 | Exceptiontype2 ex){ // catch block}
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); } } } |
输入1:
GeeksforGeeks
产出1:
Exception encountered java.lang.NumberFormatException:For input string: "GeeksforGeeks"
输入2:
0
产出2:
Exception encountered java.lang.ArithmeticException: / by zero
处理多个异常类型的catch块不会在编译器生成的字节码中创建重复。也就是说,字节码没有异常处理程序的复制。
要点:
1. 如果所有异常都属于同一个类层次结构,那么我们应该捕获基本异常类型。然而,要捕获每个异常,需要在它们的catch块中分别完成。
2. 单个catch块可以处理多种类型的异常。但是,不能在一条语句中捕获基(或祖先)类和子类(或后代)异常。例如
// Not Valid as Exception is an ancestor of // NumberFormatExceptioncatch(NumberFormatException | Exception ex)
3. 所有例外情况必须用竖条管隔开 | .
本文由 阿帕纳·瓦德拉马尼酒店 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以写一篇文章,然后将文章邮寄给评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写评论