快速业务通道

精通JBuilder:异常时的流程控制 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15

精通JBuilder:异常时的流程控制

时间:2011-08-11

发生异常时的流程控制

代码段发生异常的情况是比较复杂的,有些代码段只会发生一种异常,而有些代码会发生多种异常, 有些工作不管代码段有没有发生异常都必须进行处理。下面我们来看一下Java语言如何对这些不同情况进 行处理。

(1)使用try…catch

程序运行产生异常时,将从异常发生点中断程序并向外抛出异常信息。程序通过try…catch可以捕获 发生的异常,并做出相应的处理,下面我们来看一段异常处理的代码,如代码清单2-55所示。

代码清单2-55 异常处理

1.int x = (int)(Math.random()*5); 2.int y = (int)(Math.random()*10); 3. int[] z = new int[5]; 4.try 5.{ 6.   System.out.println("y/x ="+(y/x)); 7 .   System.out.println("y ="+y+" z[y]="+z[y]); 8.} 9.catch (ArithmeticException ex1) 10.{ 11.   System.out.println("算术运算异常:"+ex1.getMessage()); 12.} 13.catch (ArrayIndexOutOfBoundsException ex2) 14.{ 15.   System.out.println(" 数据越界异常:"+ex2.getMessage()); 16.}

这个例子中第6行可能会发生被0除的异常,而第7行会发生数组越界的异常。当x为0时,程序将抛出 ArithmeticException异常,当y值大于 4时,程序将抛出ArrayIndexOut- OfBoundsException异常。在 try{}代码块中发生的异常时被catch中相应的异常处理块捕获,并获得相应的异常处理。

值得说明的是ArithmeticException和ArrayIndexOutOfBoundsException都是属于“运行期异常”,如 果不用 try…catch…对它们进行处理,程序也是可以通过编译的,如果这两个异常属性“检查性异常” 则一定要用try…catch…对它们进行处理。

try 块中发生异常后,在发生异常代码行后的其他代码将被跳过,不予处理,流程直接到达相匹配的 catch异常处理块。所以当x=0时,第6行代码发生 ArithmeticException异常,第7行的代码将被跳过,程 序进入第9~12行的异常处理块,然后直接到达第16行的后面。

(2)使用finally

异常的处理一般还会有另外的一个部分,那就是finally块,如果你把一个finally块放到try块和 catch块的后面,当程序运行到try块后,则无论如何(除了某些极特殊的情况外)finally块都会得到执 行。

如果try块产生了异常,则finally块将在执行了相应的catch异常捕捉块后得以执行;如果try块没有 发生异常,则finally块将在try块代码执行完后执行;如果try块发生异常,且没有对应该异常的catch的 块,则finally将马上执行。

在以下特殊情况下,finally块不会被执行:

— 在finally块中发生了异常;

— 程序所在的线程死亡;

— 在前面的代码中用System.exit()退出运行;

— 关闭CPU。

精通JBuilder:异常时的流程控制(2)

时间:2011-08-11

(3)多个异常的捕捉处理

当定义了catch块时,该块将会捕获指定异常类的所有异常,包括该异常的所有子类异常,用这种方法 ,可以在一个catch块中处理一个归于某一类别的所有异常。如果你为子类的异常指定了一个特定的 catch处理块,而父类的异常放在另外一个catch块中,你将能够更精确地处理多个异常。在这种情况下, 需要满足这样的处理规则:子类异常的处理块必须在父类异常的处理块之前,否则会发生编译错误,所以 ,越“特殊”的异常越在前面处理,越“普遍”的异常越在后面处理。请看下面的异常处理块,如代码清 单 2-56所示。

代码清单2-56 处理多个可能的异常

1.try 2.{ 3.   //会引发异常的代码 4.} 5.catch (GrandchildException e1){ 6.   //处理异常 7.} 8.catch(ChildException e2) { 9.   //处理异常 10.} 11.catch(ParentException e1){ 12.   //处理异常 13.}

在上例中三个异常的继承关系为:GrandchildException->ChildException-> Parent Exception。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号