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 http://www.lxinyul.cc/
            }
        } 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);
        }
    }
}

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

最新文章

  1. 2016 Google中国开发者大会游记
  2. [C#解惑] #1 在构造函数内调用虚方法
  3. ABAP 销售范围
  4. lambda的Func<>函数
  5. hdu1166敌兵布阵_线段树单点更新
  6. OpenStack重启之后,dashboard登录不上去
  7. DevExpress GridControl 显示行号、设置行号宽
  8. 【log4js】
  9. CentOS7下安装配置vncserver
  10. Linux 下让进程在后台可靠运行的几种方法
  11. Xcode 运行报错:“Your build settings specify a provisioning profile with the UUID ****** however, no such provisioning profile was found”
  12. C语言union关键字
  13. w3chtml页面和css书写规范
  14. RecyclerView学习笔记
  15. 在Spring MVC Controller的同一个方法中,根据App还是WEB返回JSON或者HTML视图。
  16. JS中基本的一些兼容问题 可能解释的不会太清楚
  17. CMD远程连接服务器上的MySQL
  18. 深入浅出KNN算法(一) KNN算法原理
  19. servlet之servlet容器(一)
  20. python 查找目录下 文件名中含有某字符串的文件

热门文章

  1. python pyinstaller 打包程序报错解决
  2. Day1 Toast/Menu/Intent传递数据
  3. 关于 vee-validate直接引用的方法
  4. 爬虫:Scrapy15 - 调试(Debugging)Spiders
  5. Nginx与Tomcat集成
  6. 【bzoj2212】[Poi2011]Tree Rotations 权值线段树合并
  7. hdu 1564 Play a game (博弈)
  8. 《c程序设计语言》-2.6~2.8
  9. 汕头市队赛 SRM10 T1模拟只会猜题意
  10. Extend Html.EditorFor MVC