`
phinecos
  • 浏览: 343516 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

《高质量java程序设计》读书笔记之----异常处理(1)

 
阅读更多

“有所为而有所不为”。学会java和学好java并用它设计并实现高效率的程序,这两者相去甚远。

异常处理是java中最强大而又最容易误用的机制。很多人只知道大概的异常处理的语法,却没有体会异常到底可以用来做些什么,如何才能有效的使用异常,以及什么时候又不应该使用异常。总的来说,就是“有所为”是哪些,而哪些又是“有所不为”的呢?

面对这样一个强大的工具,我们要做的第一件事情就是对是不是要使用它做出自己的决定,而异常这个东西并不是在任何情况下都适用的。因此我们应该知道何时使用,何时不是使用异常。

而一旦决定使用异常了以后,我们又面临一个新的问题,那就是如何去使用异常呢?

这就是我们对异常应该思考的两个大的问题,也就是“干什么”和“怎么干”。

异常处理就是向客户表示发生的非正常情况的机制,它和断言一起构成了运行时检查的两个重要角色。主要用于运行时错误(也就是程序执行时发生的错误)的处理方面。这些错误可能是数学运算溢出,磁盘不足或者文件损坏等非正常情况。当这些错误发生时,程序应该要么去尝试恢复程序的状态,要么就直接通知用户发生了异常。

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

规则1 用时间频度来确定异常情况。

包含异常处理的代码,就算没有异常发生,也会付出额外的代价,应当从时间频度的角度来考虑是否使用异常。对于一个方法method(),如果它的一个流程分支经常发生,甚至每次调用都会发生,那么就不应该使用异常来进行控制。

java的语义规则包含两个方面的含义:一种是java类库中内置的语义检查,如数组下标越界就会引发IndexOutOfBoundsException.另一种就是我们可以自己创建新的异常,并选择何时用throw关键字来引发异常。

异常抛出后,JVM会对调用栈进行遍历来寻找匹配的catch语句,如果最后还找不到的话,就会调用ThreadGroup.uncaughtException()

异常对性能的影响有两个方面:一是异常的创建,捕获和处理都需要付出代价。另一方面,就算异常没有发生,包含异常处理的代码也会比不包含异常处理的代码需要的运行时间更多(这和我们所想的不一样,原来一直以为如果不发生异常,就根本不需要为异常处理付出代价)。

说了这么多废话,呵呵,那到底什么时候应该使用异常处理哪?答:在异常的时候使用异常处理。(^o^,先别急着骂,听我慢慢说嘛。。。)。既然我们要使用异常处理,那最基本的一个问题就必须回答:究竟什么样的情况才能算是异常情况,你又是用什么标准来评估的哪?我认为可以使用一个简单的原则:时间频度。对于一个方法method(),如果它的一个流程分支经常发生,甚至每次调用都会发生,那么就不应该使用异常来进行控制。理由很明显,首先,从性能上考虑,如果对这么频繁发生的东西进行异常处理,那么程序性能肯定会受到损害。其次,既然是经常会发生的情况,那还能叫“异常”吗?(^o^,这不是抽自己嘴巴子嘛)。

废话多了,也真无聊,来两个例子先:

例1:
FileInputStreamin;
try
{
in
=newFileInputStream(filename);
}

catch(FileNotFoundExceptionex)
{
System.out.println(
"找不到文件:"+filename);
return;
}

intch;
try
{
while((ch=in.read())!=-1)
{
System.out.println((
char)ch);
}


}

catch(IOExceptionex)
{

}
例2
FileInputStreamin;
try
{
in
=newFileInputStream(filename);
}

catch(FileNotFoundExceptionex)
{
System.out.println(
"找不到文件:"+filename);
return;
}

DataInputdin
=newDataInputStream(in);
try
{

}

catch(EOFExceptionex)
{

}

catch(IOExceptionex)
{

}
例3:
for(Iteratori=c.iterator();ihasNext();)
i.remove();

先来看例1,FileInputStream的read()返回-1表示到达文件结尾处,如果我们不这么用,而是对read()方法使用异常处理,那么在每次读全部文件时就都会到达文件结尾,那么每次都要 进行异常处理,代价太大。而另一方面,使用-1来表示文件结尾不会与文件中的字符相混淆。
再看例2,DataInput接口的readInput(),readLong(),readFloat(),readDouble()等方法都以抛出EOFException来表示到达文件结尾了。由于可能文件中存在各种数据类型,因此不能象例1一样用-1表示到达结尾处。而另一方面,读到最后一个数据后,就自然到了文件结尾,而这是不需要额外的处理的。
最后看例3,如果我们在这用异常,那么由于每次遍历集合的时候都会遇到集合中的元素全部遍历完的情况,那就是说每次都会抛出异常,那就显然不能用异常了。
从这几个例子可以得两种代替异常的方法:一是用特殊的返回值 。另一种是提前检查,如例3中的Iterator.hasNext();但他们并不能完全替代异常处理,有的时候异常处理是不二之选。
分享到:
评论

相关推荐

    高质量java程序设计读书笔记

    高质量java程序设计读书笔记,重点介绍异常、OOP编程中的继承和组合的设计方法。

    高质量JAVA程序设计-个人学习笔记

    java学习笔记-挑了一些书中的重点着重说明,个人学习笔记,见谅。

    java笔记:02.windows常用快捷键.md

    java笔记:02.windows常用快捷键.md ...同时,Java还提供了自动内存管理和异常处理机制,使开发人员能够更轻松地编写高质量的代码。 总之,Java是一种功能强大、易学易用、具有广泛应用和强大跨平台特性

    java笔记:01.IDEA常用配置总结.md

    java笔记:01.IDEA常用配置总结.md ...同时,Java还提供了自动内存管理和异常处理机制,使开发人员能够更轻松地编写高质量的代码。 总之,Java是一种功能强大、易学易用、具有广泛应用和强大跨平台特性的编

    java学习:01.JVM笔记.md

    同时,Java还提供了自动内存管理和异常处理机制,使开发人员能够更轻松地编写高质量的代码。 总之,Java是一种功能强大、易学易用、具有广泛应用和强大跨平台特性的编程语言。它的设计目标是提供一种高效的开发工具...

    java学习:01.redis笔记.md

    同时,Java还提供了自动内存管理和异常处理机制,使开发人员能够更轻松地编写高质量的代码。 总之,Java是一种功能强大、易学易用、具有广泛应用和强大跨平台特性的编程语言。它的设计目标是提供一种高效的开发工具...

    java笔记:03.jdk的卸载和安装.md

    同时,Java还提供了自动内存管理和异常处理机制,使开发人员能够更轻松地编写高质量的代码。 总之,Java是一种功能强大、易学易用、具有广泛应用和强大跨平台特性的编程语言。它的设计目标是提供一种高效的开发工具...

    01.Vue学习笔记.md

    同时,Java还提供了自动内存管理和异常处理机制,使开发人员能够更轻松地编写高质量的代码。 总之,Java是一种功能强大、易学易用、具有广泛应用和强大跨平台特性的编程语言。它的设计目标是提供一种高效的开发工具...

    毕设&课设&项目&实训-JavaScript学习笔记大全,基于JavaScript高级程序设计写的.zip

    【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目...

    若干源程序资料12.rar

    2012-06-11 21:40 1,000,923 Windows程序设计(第5版)配套代码.rar 2012-06-11 21:31 5,504,736 《PC游戏编程(网络游戏篇)》光盘源代码.rar 2012-06-11 21:09 461,754 一个各种着名算法问题的c源程序包,推荐.rar...

    asp.net知识库

    Essential .NET 读书笔记 [第一部分] NET FrameWork的Collections支持 .NET的反射在软件设计上的应用 关于跨程序集的反射 实现C#和VB.net之间的相互转换 深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述...

    同济大学汇编语言程序设计课程个人整理笔记,作业以及课程资料.zip

    【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目...

    c语言课堂笔记.zip

    C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言描述问题比汇编语言迅速、工作量小、可读性好、易于调试、修改和移植,而...

    基于 Android 和 MySql 的云笔记本程序。.zip

    【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】: 适用于希望学习不同技术领域的小白或进阶学习者。 可作为毕设项目、课程设计、大作业、工程实训或初期项目...

    基于ASP的笔记本销售网站的设计与实现(源代码+thesis).zip

    项目是基于ASP.NET的Web应用程序开发,旨在构建一个高性能、可扩展和可靠的在线平台。我们将使用ASP.NET MVC框架和C#编程语言来实现这个项目。 ASP.NET MVC是一种成熟的开发框架,它采用模型-视图-控制器的设计模式...

    Java项目源码基于VUE.js的在线教育系统+vue(完整源码+说明文档+lw).rar

    基于Vue.js技术的在线教育系统是一个全栈解决方案,旨在为用户提供高质量的在线学习资源和优质的教学服务。 系统的后端部分主要包括以下功能: 用户管理:系统支持学生和教师的注册和登录,以及个人信息管理,包括...

    SpringBoot项目在线教育系统.zip

    SpringBoot项目在线教育系统是一个面向教育行业的网络应用程序,旨在提供优质的在线教学和管理服务。该系统通常包括前台网站系统和后台运营平台,采用B2C模式开发,前后端分离的设计使得系统更加灵活和可维护。后端...

Global site tag (gtag.js) - Google Analytics