UDN-企业互联网技术人气社区

板块导航

浏览  : 497
回复  : 2

[实例] 解析Java中未被捕获的异常以及try语句的嵌套使用

[复制链接]
饼干妹妹的头像 楼主
发表于 2015-11-6 16:55:05 | 显示全部楼层 |阅读模式
    这篇文章主要介绍了Java中未被捕获的异常以及try语句的嵌套使用,是Java入门学习中的基础知识,需要的朋友可以参考下

Java未被捕获的异常

    在你学习在程序中处理异常之前,看一看如果你不处理它们会有什么情况发生是很有好处的。下面的小程序包括一个故意导致被零除错误的表达式。

  1. class Exc0 {
  2.   public static void main(String args[]) {
  3.     int d = 0;
  4.     int a = 42 / d;
  5.   }
  6. }
复制代码

    当Java运行时系统检查到被零除的情况,它构造一个新的异常对象然后抛出该异常。这导致Exc0的执行停止,因为一旦一个异常被抛出,它必须被一个异常处理程序捕获并且被立即处理。该例中,我们没有提供任何我们自己的异常处理程序,所以异常被Java运行时系统的默认处理程序捕获。任何不是被你程序捕获的异常最终都会被该默认处理程序处理。默认处理程序显示一个描述异常的字符串,打印异常发生处的堆栈轨迹并且终止程序。

下面是由标准javaJDK运行时解释器执行该程序所产生的输出:

  1. java.lang.ArithmeticException: / by zero
  2. at Exc0.main(Exc0.java:4)
复制代码

    注意,类名Exc0,方法名main,文件名Exc0.java和行数4是怎样被包括在一个简单的堆栈使用轨迹中的。还有,注意抛出的异常类型是Exception的一个名为ArithmeticException的子类,该子类更明确的描述了何种类型的错误方法。本章后面部分将讨论,Java提供多个内置的与可能产生的不同种类运行时错误相匹配的异常类型。

    堆栈轨迹将显示导致错误产生的方法调用序列。例如,下面是前面程序的另一个版本,它介绍了相同的错误,但是错误是在main( )方法之外的另一个方法中产生的:
  1. class Exc1 {
  2.   static void subroutine() {
  3.     int d = 0;
  4.     int a = 10 / d;
  5.   }
  6.   public static void main(String args[]) {
  7.     Exc1.subroutine();
  8.   }
  9. }
复制代码

    默认异常处理器的堆栈轨迹结果表明了整个调用栈是怎样显示的:
  1. java.lang.ArithmeticException: / by zero
  2. at Exc1.subroutine(Exc1.java:4)
  3. at Exc1.main(Exc1.java:7)
复制代码

    如你所见,栈底是main的第7行,该行调用了subroutine( )方法。该方法在第4行导致了异常。调用堆栈对于调试来说是很重要的,因为它查明了导致错误的精确的步骤。

Java try语句的嵌套

    Try语句可以被嵌套。也就是说,一个try语句可以在另一个try块内部。每次进入try语句,异常的前后关系都会被推入堆栈。如果一个内部的try语句不含特殊异常的catch处理程序,堆栈将弹出,下一个try语句的catch处理程序将检查是否与之匹配。这个过程将继续直到一个catch语句匹配成功,或者是直到所有的嵌套try语句被检查耗尽。如果没有catch语句匹配,Java的运行时系统将处理这个异常。下面是运用嵌套try语句的一个例子:
  1. // An example of nested try statements.
  2. class NestTry {
  3.   public static void main(String args[]) {
  4.     try {
  5.       int a = args.length;
  6.       /* If no command-line args are present,the following statement will generate a divide-by-zero exception. */
  7.       int b = 42 / a;
  8.       System.out.println("a = " + a);
  9.       try { // nested try block
  10.         /* If one command-line arg is used,then a divide-by-zero exception will be generated by the following code. */
  11.         if(a==1) a = a/(a-a); // division by zero
  12.         /* If two command-line args are used,then generate an out-of-bounds exception. */
  13.         if(a==2) {
  14.           int c[] = { 1 };
  15.           c[42] = 99; // generate an out-of-bounds exception
  16.         }
  17.       } catch(ArrayIndexOutOfBoundsException e) {
  18.         System.out.println("Array index out-of-bounds: " + e);
  19.       }
  20.     } catch(ArithmeticException e) {
  21.       System.out.println("Divide by 0: " + e);
  22.     }
  23.   }
  24. }
复制代码

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

  1. C:\>java NestTry
  2. Divide by 0: java.lang.ArithmeticException: / by zero
  3. C:\>java NestTry One
  4. a = 1
  5. Divide by 0: java.lang.ArithmeticException: / by zero
  6. C:\>java NestTry One Two
  7. a = 2
  8. Array index out-of-bounds: java.lang.ArrayIndexOutOfBoundsException
复制代码

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

  1. /* Try statements can be implicitly nested via calls to methods. */
  2. class MethNestTry {
  3.   static void nesttry(int a) {
  4.     try { // nested try block
  5.       /* If one command-line arg is used,then a divide-by-zero exception will be generated by the following code. */
  6.       if(a==1) a = a/(a-a); // division by zero
  7.       /* If two command-line args are used,then generate an out-of-bounds exception. */
  8.       if(a==2) {
  9.         int c[] = { 1 };
  10.         c[42] = 99; // generate an out-of-bounds exception
  11.       }
  12.     } catch(ArrayIndexOutOfBoundsException e) {
  13.       System.out.println("Array index out-of-bounds: " + e);
  14.     }
  15.   }

  16.   public static void main(String args[]) {
  17.     try {
  18.       int a = args.length;
  19.       /* If no command-line args are present,the following statement will generate a divide-by-zero exception. */
  20.       int b = 42 / a;
  21.       System.out.println("a = " + a);
  22.       nesttry(a);
  23.     } catch(ArithmeticException e) {
  24.       System.out.println("Divide by 0: " + e);
  25.     }
  26.   }
  27. }
复制代码

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

您可能感兴趣的文章:
  • Java中异常处理之try和catch代码块的使用
  • 浅析Java异常处理中断言的使用
  • 详解Java的内置异常以及创建自定义异常子类的方法

相关帖子

发表于 2015-11-12 11:55:42 | 显示全部楼层
js是要逆天的节奏js虽然不错,但是天生也是有缺陷,局限性。。。
使用道具 举报

回复

发表于 2015-11-13 11:52:27 | 显示全部楼层
LZ是闲人,天天发帖,坚定完毕
使用道具 举报

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部