📜  Java多捕获Multicatch

📅  最后修改于: 2020-04-05 07:15:48             🧑  作者: Mango

背景

在Java 7之前,我们必须在每个catch块中仅捕获一种异常类型。因此,每当我们需要处理一个以上的特定异常,但对所有异常采取相同的措施时,我们就必须拥有一个以上的包含相同代码的catch块。
在下面的代码中,我们必须处理两个不同的异常,但对两个异常都采取相同的操作。因此,从Java 6.0开始,我们需要有两个不同的catch块。

// Java展示在Java7之前,我们必须在每个catch块中仅捕获一种异常类型
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 + " 是99的因子");
        }
        catch (ArithmeticException ex)
        {
            System.out.println("Arithmetic " + ex);
        }
        catch (NumberFormatException ex)
        {
            System.out.println("Number Format Exception " + ex);
        }
    }
}

输入1:

芒果文档

输出2:

Exception encountered java.lang.NumberFormatException:
For input string: "芒果文档"

输入2:

0

输出2:

Arithmetic Exception encountered java.lang.ArithmeticException: / by zero

从Java 7.0开始,单个catch块可以通过用|分隔每个异常来捕获多个异常。

// Java展示多捕获multicatch
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 + " 是99的因子");
        }
        catch (NumberFormatException | ArithmeticException ex)
        {
            System.out.println("Exception encountered " + ex);
        }
    }
}

输入1:

芒果文档

输出1:

Exception encountered java.lang.NumberFormatException:
For input string: "芒果文档"

输入2:

0

输出2:

Exception encountered
java.lang.ArithmeticException: / by zero

一个处理多个异常类型的catch块不会在编译器生成的字节码中创建任何重复项,也就是说,该字节码不具有异常处理程序的复制项。

重要事项:

  • 如果所有异常都属于同一类层次结构,则应捕获基本异常类型。但是,要捕获每个异常,需要在自己的捕获块中分别进行处理。
  • 单个catch块可以处理多种类型的异常。但是,基(或祖先)类和子类(或后代)异常不能在一条语句中捕获。例如
    // 下面不合法,因为Exception是NumberFormatException的祖先
    catch(NumberFormatException | Exception ex)
  • 所有例外必须由竖线分隔