📜  Java多捕获块

📅  最后修改于: 2022-05-13 01:54:44.989000             🧑  作者: Mango

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 块的程序,因为没有代码冗余。

句法:

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.所有异常必须用竖条管| .