Java中的多个捕获块

时间:2020-01-09 10:34:56  来源:igfitidea点击:

如果听到" try-catch块"这个术语使我们想到可以拥有一个try块和一个关联的catch块,那么这是一个错误的想法。我们可以将多个catch块与try块关联。在这篇文章中,我们将看到Java异常处理中多个catch块的示例。

参考Java中的Multi-Catch Exception,以了解使用Java 7中可用的multi-catch语句对多个catch块进行分组的另一种方法。

我们将可能引发异常的代码封装在try块中,但是所封装的代码也可能引发多个异常。为了处理这些异常,我们可以在Java中提供多个catch块。如果引发了异常,则异常处理机制会使用与所引发的异常类型相匹配的参数来查找catch块。仅执行多个catch块中匹配的catch子句。执行匹配的catch块之后,在try-catch块之后继续执行。

Java中的多个catch块示例

在此示例程序中,方法calculateValue中有一个长度为3的数组。数组的索引作为参数传递给方法。由于数组在索引1处的值为0,因此将1作为索引传递会由于除以零而导致ArithmeticException。以相同的方式将4作为索引传递将导致ArrayIndexOutOfBoundsException,因为数组的长度为3. 要处理这些多个异常情况,有多个catch块与try块关联。

public class MultipleCatch {
  private void calculateValue(int i){
    int arr[] = {6, 0, 3};
    try{
      int num = 7/arr[i];
    }catch(ArithmeticException exp){
      exp.printStackTrace();
    }catch(ArrayIndexOutOfBoundsException exp){
      exp.printStackTrace();
    }catch(Exception exp){
      exp.printStackTrace();
    }
    System.out.println("After the try-catch block");
  }

  public static void main(String[] args) {
    MultipleCatch obj = new MultipleCatch();
    obj.calculateValue(1);
    obj.calculateValue(4);
  }
}

输出:

java.lang.ArithmeticException: / by zero
	at com.theitroad.MultipleCatch.calculateValue(MultipleCatch.java:7)
	at com.theitroad.MultipleCatch.main(MultipleCatch.java:21)
After the try-catch block
java.lang.ArrayIndexOutOfBoundsException: 4
	at com.theitroad.MultipleCatch.calculateValue(MultipleCatch.java:7)
	at com.theitroad.MultipleCatch.main(MultipleCatch.java:22)
After the try-catch block

在多个catch块中维护异常层次结构

在Java中使用多个catch块时,我们必须牢记异常层次结构,这意味着我们必须确保任何异常超类都不会在其异常子类之前出现。

这应该得到保证,因为将异常超类作为参数的catch语句将能够捕获其类型及其任何子类的异常。因此,将具有子类作为自变量的catch语句放在以超类作为自变量的catch语句之后,将意味着无法获得具有子类的catch语句。此外,无法访问的代码会导致Java中的编译时错误,因此,对于任何此类放置错误的catch语句,我们都会得到编译错误。

在上一个示例中,最后一个catch语句将Exception类对象作为参数来捕获任何其他类型的异常。由于Exception类是ArithmeticException和ArrayIndexOutOfBoundsException的超类,因此将catch语句放在第一位将导致编译时错误。只需调整上面的示例,然后将Exception类对象作为参数的catch语句放在其他catch块之前。

public class MultipleCatch {
  private void calculateValue(int i){
    int arr[] = {6, 0, 3};
    try{
      int num = 7/arr[i];
    }
    catch(Exception exp){
      exp.printStackTrace();
    }catch(ArithmeticException exp){
      exp.printStackTrace();
    }catch(ArrayIndexOutOfBoundsException exp){
      exp.printStackTrace();
    }
    System.out.println("After the try-catch block");
  }

  public static void main(String[] args) {
    MultipleCatch obj = new MultipleCatch();
    obj.calculateValue(1);
    obj.calculateValue(4);
  }
}

这将导致编译时错误,编译器会抱怨代码无法到达。

Unresolved compilation problems: 
	Unreachable catch block for ArithmeticException. It is already handled by the catch block for Exception
	Unreachable catch block for ArrayIndexOutOfBoundsException. It is already handled by the catch block for Exception

	at com.theitroad.MultipleCatch.calculateValue(MultipleCatch.java:11)
	at com.theitroad.MultipleCatch.main(MultipleCatch.java:21)

重要事项

  • try块之后可能有多个catch块。
  • 如果在try块中引发了异常,则执行具有匹配异常类型的catch块。
  • 仅执行多个catch块之一。
  • 必须按照特定于常规的顺序放置多个捕获块。