收藏 分享(赏)

南京java培训机构 浅谈java中的异常.doc

上传人:cjc2202537 文档编号:1286128 上传时间:2018-06-21 格式:DOC 页数:8 大小:77KB
下载 相关 举报
南京java培训机构 浅谈java中的异常.doc_第1页
第1页 / 共8页
南京java培训机构 浅谈java中的异常.doc_第2页
第2页 / 共8页
南京java培训机构 浅谈java中的异常.doc_第3页
第3页 / 共8页
南京java培训机构 浅谈java中的异常.doc_第4页
第4页 / 共8页
南京java培训机构 浅谈java中的异常.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、 江苏万和计算机培训中心地址:南京市中山北路 26号新晨国际大厦 24层(地铁鼓楼站 4A出口)官方网站:http:/南京 Java 培训机构 浅谈 Java 中的异常作为一个面向对象编程的程序员对于 下面的一句一定非常熟悉:try/ 代码块catch(Exception e)/ 异常处理finally/ 清理工作就是面向对象中最最常见的异常处理程序,而且甚至我们会莫名其妙的被编译器要求加上这个模块,甚至我们自己也不知道捕捉到异常该怎么处理为什么要有异常其实这个问题不用多说,程序员都知道,简单总结为一句话:就是为了增强程序健壮性呗,比如下面的代码:Class DenominatorZeroEx

2、ception extends Exceptionpublic double division(int numerator,int denominator) throws DenominatorZeroException江苏万和计算机培训中心地址:南京市中山北路 26号新晨国际大厦 24层(地铁鼓楼站 4A出口)官方网站:http:/double result;tryif(denominator = 0)throw new DenominatorZeroException() ;elseresult = numerator/denominator;catch(DenominatorZeroEx

3、ception e)e.printStackTrace() ;return -1;return result;这段代码很简单,就是为了预防除法中发生分母为 0 的情况,为了增强代码的健壮性,我声明了一个自定义的异常名为:DenominatorZeroException,这个异常继承自所有异常的根类 Exception,当代码发现分母为 0 的时候就将 new 一个异常然后跑出,当 catch 捕捉到这个异常后,则返回一个预先定义好的标志-1;否则正常返回除法结果。其实在 Java 语言中,按照我自己看书和平时编程的理解,异常的作用可以概括为以下两点:增强程序健壮性。当遇到异常(为什么叫异常而不

4、是错误,就是说在当前编程环境下,出现这种情况很奇怪,不正常,无法解决)我们可以捕获它,然后有两种选择:一是就像上面的代码一样,我们知道异常的原因,然后进行相应的处理,这样并不会影响程序的正常执行;二是我们并不知道捕获这个异常该怎么处理,我们就可以利用 Java 的异常链可以将这个异常抛给上一级代码或者直接抛给控制台(就像上面的代码e.printStackTrace()打印出栈轨迹或者利用异常说明加在主函数入口处) 。江苏万和计算机培训中心地址:南京市中山北路 26号新晨国际大厦 24层(地铁鼓楼站 4A出口)官方网站:http:/报告。Java 程序员可能会发现当我们程序遇到 bug 停止的时

5、候,所有报告的错误信息都是以异常的形式产生的,这样统一的形式使得程序员在编写程序时不必考虑如果程序运行出错怎么办,Java 会做好的,出错会向你报告而且绝对不会遗漏(除了异常“吞咽“,稍后说明) ,程序员就可以专心设计和实现自己的代码了。throw 关键字我们要将一个异常跑出就需要 throw 关键字,其实在某种程度上,我们可以将 throw和 return 进行一个类比,因为当我们使用 throw 抛出异常时就会跳出当前的方法或者作用域,这与 return 是非常相似的。但是一定不能混淆,因为 return 关键字返回的“地点“一般就是主调函数处然而 throw 抛出异常,而捕获异常的这个“

6、地点“可能距离现有函数的地址很远。Class DenominatorZeroException extends ExceptionClass AnotherException extends Exceptionpublic AnotherException(String s)super(s) ;public double division(int numerator,int denominator) throws DenominatorZeroException, AnotherExceptiondouble result;tryif(denominator = 0)throw new Den

7、ominatorZeroException() ;elseresult = numerator/denominator;江苏万和计算机培训中心地址:南京市中山北路 26号新晨国际大厦 24层(地铁鼓楼站 4A出口)官方网站:http:/catch(DenominatorZeroException e)throw e;/*或者*/throw new RuntimeException(e) ;/*或者*/AnotherException ae = new AnotherException(“from division“) ;ae.initCause(new DenominatorZeroExcep

8、tion() ) ;throw ae;return result;还是上面除法的例子,我想做点说明:当我们在 catch 中捕获到一个异常不知道怎么处理时,可以利用 throw 直接再将这个异常抛出;同样我们也可以直接将这个异常抛给 RuntimeException,让它直接抛出运行时异常(就是现实在控制台的错误信息) ;然而上面两种方式有一个问题就是当我们再次抛出异常时,我们最一开始发生异常的位置就会丢失,所以我们利用 initCause 将原先的异常加入,并且在异常信息中也添加了“from division“解释异常“吞噬“,就是捕获了异常什么都不做,也不抛出,那么这样很危险,因为找不到错

9、误信息了。异常说明 throws我们在调用 Java 的库函数的时候肯定会遇到这种情况(尤其是 IO 操作的地方):就江苏万和计算机培训中心地址:南京市中山北路 26号新晨国际大厦 24层(地铁鼓楼站 4A出口)官方网站:http:/是调用了一个函数,然后编译器报错,给出的解决方案是要么加入 try,catch 块,要么就在主调函数的后面加上 throws,并且后面跟上可能抛出的异常。这里后者就是所谓的异常说明。为什么要有异常说明:这主要是编写类的程序员要将方法可能会抛出的异常告知客户端程序员。格式:方法名() throws 所有潜在异常类型列表异常说明将 Java 中的异常分为了两类,一类是

10、被检查的异常,即 Exception 及所有继承自它的异常;另一类是不受检查的异常,即 RuntimeException,即运行时异常。怎么理解呢?说白了就是,被检查的异常只要你在函数中要用到 throw 抛出异常或者说你调用的函数利用了 throw 抛出了异常,那么你就必须在函数后面加上 throws 关键字并在后面列出所有可能抛出的异常;而不受检查的异常就是你抛出它的时候不用做特别说明,就像上面除法的例子一样。这种自顶向下的约束,可以保证 Java 代码一定水平的异常正确性。但是这里是有争议的,有些人认为这样好,但有些人认为这样会影响程序员的编程效率,因为有时候你根本就不知道你捕捉的是什么

11、异常,也不知道该怎么处理,但是编译器会强制要求你加上这些模块。finally 关键字finally 关键字常用数据库的哥们肯定懂,一般我们在 finally 里要关闭数据库连接或者做一些清理工作。关于 finally 我想说两点有趣的事情:一、保证完成任务为什么这么说 finally 关键字呢,就是因为无论在 try 语句中执行了什么命令,finally 中的语句块一定会执行(这就确保了有些必要的清理工作) ,如:public class MultipleReturnspublic static void f(int i)System.out.println(“Initialization t

12、hat requires cleanup“) ;江苏万和计算机培训中心地址:南京市中山北路 26号新晨国际大厦 24层(地铁鼓楼站 4A出口)官方网站:http:/trySystem.out.println(“Point 1“) ;if (i = 1)return;System.out.println(“Point 2“) ;if (i = 2)return;System.out.println(“Point 3“) ;if (i = 3)return;System.out.println(“End“) ;return;finallySystem.out.println(“Performing

13、 cleanup“) ;public static void main(String args)for (int i = 1; i = 4; i+)江苏万和计算机培训中心地址:南京市中山北路 26号新晨国际大厦 24层(地铁鼓楼站 4A出口)官方网站:http:/f(i) ;大家执行这段代码会惊奇的发现,即使 try 中代码调用了 return 命令但是 finally 也一定会执行。二、嵌套 trypublic class Cleanuppublic static void main(String args)tryInputFile in = new InputFile(“Cleanup.j

14、ava“) ;tryString s;int i = 1;while (s = in.getLine() ) != null); / Perform line-by-line processing herecatch (Exception e)江苏万和计算机培训中心地址:南京市中山北路 26号新晨国际大厦 24层(地铁鼓楼站 4A出口)官方网站:http:/System.out.println(“Caught Exception in main“) ;e.printStackTrace(System.out) ;finallyin.dispose() ;/自定义catch (Exception e)System.out.println(“InputFile construction failed“) ; /* Output: dispose() successful*/ :对于这个例子,我们看出我们要创建 InputFile 对象,当我们成功创建它时需要用dispose 方法对其进行清理,然而如果失败时我们并不需要对其进行清理。倘若只有一个不使用嵌套 try 块,那么不管怎样 finally 都会执行。所以为了避免这种情况,上面的嵌套 try 语句就起到了作用。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 学术论文 > 论文指导/设计

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报