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); } }
}

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

Java基础篇:如何嵌套try语句?相关推荐

  1. Java基础篇:嵌套 switch 语句

    可以将一个switch语句作为一个外部switch语句的语句序列的一部分,这称为嵌套switch语句.因为一个switch语句定义了自己的块,外部switch语句和内部switch语句的case常量不 ...

  2. Java基础篇:嵌套 if 语句

    嵌套(nested)if语句是指该if语句为另一个if或者else语句的对象.在编程时经常要用到嵌套if语句.当你使用嵌套if语句时,需记住的要点就是:一个else语句总是对应着和它在同一个块中的最近 ...

  3. Android面试题Java基础篇

    Android面试题Java基础篇,由本人整理汇总,后续将继续推出系列篇,如果喜欢请持续关注和推荐,更多精彩内容可以关注微信公众号(Android高级编程):android-tech 系列文章目录: ...

  4. Java基础篇 学习笔记

    List item Java基础篇 学习笔记 java基础篇 第1章 计算机.程序和java概述 学习笔记 1.1什么是计算机 简单来说:计算机就是 ' 存储 ' 和 ' 处理 ' 数据的电子设备. ...

  5. java基础篇_java基础篇1

    JAVA基础篇1 注释 单行注释 //这是一个单行注释,由两个斜杠组成,不能嵌套多行注释 多行注释 /*这是一个 多行注释 ,//里面不能嵌套多行注释, 但是可以嵌套单行注释*/ 文档注释 /**ja ...

  6. 你所需要的java基础篇深入解析大汇总

    java基础篇深入解析大总结 java基础(一) 深入解析基本类型 java基础(二) 自增自减与贪心规则 java基础(三) 加强型for循环与Iterator java基础(四) java运算顺序 ...

  7. Java基础篇3——流程控制

    Java基础篇3--流程控制 1.顺序结构 正常代码的流程即是顺序流程 2.分支结构 2.1.if-else分支 if(条件表达式) {语句块1; } if(条件表达式) {语句块1; } else ...

  8. 菜鸟学习笔记:Java基础篇7(包装类、时间相关类、文件类、异常处理类)

    菜鸟学习笔记:Java其他常用类 基本数据类型包装类 时间处理和文件处理相关类 Date时间类 SimpleDateFormat Calendar日历类 文件类 异常机制 异常的概念 Java异常处理 ...

  9. 菜鸟学习笔记:Java基础篇4(面向对象三大特征)

    菜鸟学习笔记:Java面向对象篇中 继承 概念 方法重写(override) Object类 Super关键字 组合 final关键字补充 封装 访问控制符 多态 继承 概念 继续上一篇的例子: #m ...

  10. 菜鸟学习笔记:Java基础篇3(面向对象思想、程序执行过程内存分析、面向对象重要概念)

    菜鸟学习笔记:Java面向对象篇上 Java面向对象的思想 Java程序执行过程内存分析 Java垃圾回收机制 构造方法 方法重载(overload) static关键字 this关键字 Java面向 ...

最新文章

  1. python入门(12)dict
  2. 遇见那个对的人,便是爱情
  3. 14. 函数返回值为引用?
  4. 这 9 个 Java 开源项目 yyds,你知道几个?
  5. 干加个偏旁可以变成什么字_面试官:“干”字加一笔,变成什么字?回答王和午字不对...
  6. LeetCode 1940. 排序数组之间的最长公共子序列(二分查找)
  7. c 调用java程序_C ++可以调用Java代码吗?
  8. mysql安装之后怎么进入_MySQL常规练习 .MySQL安装成功后的进入方式
  9. 用python实现bt下载_python实现bt种子 torrent转magnet
  10. Linux运行权限1009无标题,Linux权限管理练习
  11. ★另人无比怀念的90年代动画片★ ‖最终整理篇‖
  12. ปอเช็ตติโน่ เสียดายโอกาสของทีมในเกมฟัดหงส์
  13. 从全拼音中得到汉字拼音
  14. Maxwell 转矩出现正负值情况解决措施
  15. 【VPP】 VPP之DPO
  16. android adb点击坐标,Android adb shell 获得点击屏幕的位置坐标
  17. 2022年A特种设备相关管理(电梯)考试模拟100题及答案
  18. android 相机预览的分辨率,Android开发 Camera2开发_2_预览分辨率或拍照分辨率的计算...
  19. CCNA实验之---路由器密码的恢复
  20. oracle安装没有scott,Oracle安装时忘记解锁scott用户的解决方案

热门文章

  1. 没有编辑器时,使用echo更换源
  2. sed与正则用法收集
  3. RPM方式安装MySQL5.5.48 (Aliyun CentOS 7.0 卸载MySQL5.7)
  4. [转载]程序员的激情其实是一种痛苦
  5. android中finish和system.exit方法退出的区别
  6. sdut2355Binary Search Heap Construction
  7. Mongodb在Ubuntu下的安装
  8. poj2777线段树
  9. 再学 GDI+[77]: 区域(6) - GetRegionScans - 获取区域中的所有矩形
  10. python---之suplot和suplots的区别