Try语句可以被嵌套。也就是说,一个try语句可以在另一个try块内部。每次进入try语句,异常的前后关系都会被推入堆栈。如果一个内部的try语句不含特殊异常的catch处理程序,堆栈将弹出,下一个try语句的catch处理程序将检查是否与之匹配。这个过程将继续直到一个catch语句匹配成功,或者是直到所有的嵌套try语句被检查耗尽。如果没有catch语句匹配,Java的运行时系统将处理这个异常。下面是运用嵌套try语句的一个例子:

  //An example of nested try statements.

  class NestTry{

  public static void main(String args[]){

  try{

  int a=args.length;

  /If no command-line args are present,the following statement will generate a divide-by-zero exception./

  int b=42/a;

  System.out.println("a="+a);

  try{//nested try block

  /If one command-line arg is used,then a divide-by-zero exception will be generated by the following code./

  if(a==1)a=a/(a-a);//division by zero

  /If two command-line args are used,then generate an out-of-bounds exception./

  if(a==2){

  int c[]={1};

  c[42]=99;//generate an out-of-bounds exception

  }

  }catch(ArrayIndexOutOfBoundsException e){

  System.out.println("Array index out-of-bounds:"+e);

  }

  }catch(ArithmeticException e){

  System.out.println("Divide by 0:"+e);

  }

  }

  }

  如你所见,该程序在一个try块中嵌套了另一个try块。程序工作如下:当你在没有命令行参数的情况下执行该程序,外面的try块将产生一个被零除的异常。程序在有一个命令行参数条件下执行,由嵌套的try块产生一个被零除的错误。因为内部的块不匹配这个异常,它将把异常传给外部的try块,在那里异常被处理。如果你在具有两个命令行参数的条件下执行该程序,由内部try块产生一个数组边界异常。下面的结果阐述了每一种情况:

  C:\>java NestTry

  Divide by 0:java.lang.ArithmeticException:/by zero

  C:\>java NestTry One

  a=1

  Divide by 0:java.lang.ArithmeticException:/by zero

  C:\>java NestTry One Two

  a=2

  Array index out-of-bounds:java.lang.ArrayIndexOutOfBoundsException

  当有方法调用时,try语句的嵌套可以很隐蔽的发生。例如,你可以把对方法的调用放在一个try块中。在该方法内部,有另一个try语句。这种情况下,方法内部的try仍然是嵌套在外部调用该方法的try块中的。下面是前面例子的修改,嵌套的try块移到了方法nesttry()的内部:

  /Try statements can be implicitly nested via calls to methods./

  class MethNestTry{

  static void nesttry(int a){

  try{//nested try block

  /If one command-line arg is used,then a divide-by-zero exception will be generated by the following code./

  if(a==1)a=a/(a-a);//division by zero

  /If two command-line args are used,then generate an out-of-bounds exception./

  if(a==2){

  int c[]={1};

  c[42]=99;//generate an out-of-bounds exception

  }

  }catch(ArrayIndexOutOfBoundsException e){

  System.out.println("Array index out-of-bounds:"+e);

  }

  }

  public static void main(String args[]){

  try{

  int a=args.length;

  /If no command-line args are present,the following statement will generate a divide-by-zero exception./

  int b=42/a;

  System.out.println("a="+a);

  nesttry(a);

  }catch(ArithmeticException e){

  System.out.println("Divide by 0:"+e);

  }

  }

  }

  该程序的输出与前面的例子相同。

  更多技术教程,请关注技术教程网www.jishujc.com