Java多捕获块
在Java 7 之前,我们只能在每个 catch 块中捕获一种异常类型。因此,当我们需要处理多个特定异常但对所有异常采取某种措施时,我们必须有多个包含相同代码的 catch 块。
在下面的代码中,我们必须处理两个不同的异常,但对两者采取相同的操作。因此,从Java 6.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);
}
}
}
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:
Arithmetic Exception encountered java.lang.ArithmeticException: / by zero
Java中的多个 Catch 块
从Java 7.0 开始,单个 catch 块可以通过用 | 分隔多个异常来捕获多个异常。 (管道符号)在 catch 块中。
在单个 catch 块中捕获多个异常可减少代码重复并提高效率。编译此程序时生成的字节码将小于具有多个 catch 块的程序,因为没有代码冗余。
Note: If a catch block handles multiple exceptions, the catch parameter is implicitly final. This means we cannot assign any values to catch parameters.
句法:
try {
// code
}
catch (ExceptionType1 | Exceptiontype2 ex){
// catch block
}
Java Multiple Catch 块流程图
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
// NumberFormatException
catch(NumberFormatException | Exception ex)
3.所有异常必须用竖条管| .