“有所为而有所不为”。学会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:
        FileInputStream in;
        try
        {
            in = new FileInputStream(filename);
        }
        catch(FileNotFoundException ex)
        {
            System.out.println("找不到文件:"+filename);
            return;
        }
        int ch;
        try
        {
            while((ch=in.read())!=-1)
            {
                System.out.println((char)ch);
            }
            
        }
        catch(IOException ex)
        {
            
        }
例2
            FileInputStream in;
        try
        {
            in = new FileInputStream(filename);
        }
        catch(FileNotFoundException ex)
        {
            System.out.println("找不到文件:"+filename);
            return;
        }
        DataInput din = new DataInputStream(in);
        try
        {
            
        }
        catch(EOFException ex)
        {
            
        }
        catch(IOException ex)
        {
            
        }
例3:
      for(Iterator i=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程序设计》读书笔记之----异常处理(1)相关推荐

  1. java虚拟机读书笔记 第三章 垃圾收集器和内存分配策略

    java虚拟机读书笔记 第三章 垃圾收集器和内存分配策略 GC需要完成的三件事情:哪些内存需要回收.什么时候回收.如何回收 垃圾回收器在对堆进行回收前,首先要确定那些对象存活,哪些对象已经死去,判断的 ...

  2. Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据

    Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据 Oracle PL/SQL 程序设计读书笔记 - 第7章 使用数据 7.1 程序数据的命名 PL/SQL要求在给数据结构命名的时候应 ...

  3. Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理

    Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 Oracle PL/SQL 程序设计读书笔记 - 第14章 DML和事务管理 ACID原则:即一个事务具有原子性.一致性. ...

  4. 5W字高质量java并发系列详解教程(上)-附PDF下载

    文章目录 第一章 java.util.concurrent简介 主要的组件 Executor ExecutorService ScheduledExecutorService Future Count ...

  5. PHP程序设计读书笔记七

    一.比较字符串: 1."=="和"==="的区别: "=="在比较之前会先把非字符串类型的操作数转换成字符串,所以"3" ...

  6. Core Java 8 读书笔记-Networking编程

    Core Java 8 读书笔记-Networking编程 作者:老九-技术大黍 原文:Core Java 8th Edition 社交:知乎 公众号:老九学堂(新人有惊喜) 特别声明:原创不易,未经 ...

  7. 100个高质量Java开发者博客

    本文由 ImportNew - 夏千林 翻译自 programcreek .如需转载本文,请先参见文章末尾处的转载要求. 本文的主要目的是收集全球范围内100个高质量Java开发者博客.其中会有一些博 ...

  8. 【伯乐在线】100个高质量Java开发者博客

    本文由 ImportNew - 夏千林 翻译自 programcreek.欢迎加入翻译小组.转载请见文末要求. ImportNew注:原文中还没有100个.作者希望大家一起来推荐高质量的Java开发博 ...

  9. 人类高质量 Java 学习路线【一条龙版】

    大家好,我是张讨嫌.现在网上的编程资料实在太多了,而且人人肯定都说自己的最好,那就导致大家又不知道怎么选了.大部分的博主推荐资源,也就是把播放量高的视频说一遍,水一期视频,没有一条很清晰的学习路线. ...

最新文章

  1. WSL的openssh-server使用报错:Could not load host key: /etc/ssh/ssh_host_rsa_key
  2. centos让yum自动选择最快的源
  3. java slf4j日志框架_SLF4J - 日志框架 - 类库 - Java - 代码树
  4. Spring Boot、Spring Cloud、Spring Cloud Alibaba版本关系查询
  5. 代码优化之减少重复代码-实践
  6. php开发微信图灵机器人
  7. python 网站模板_使用Python抓取模板之家的CSS模板
  8. Java 相关计数问题及其实现
  9. 进程管理之工作管理详解(job control)
  10. redis监控工具_企业级别Redis监控,细化到每个项目实例
  11. 挑战程序设计竞赛2:算法与数据结构(电子书与代码)
  12. matlab数组从小到大排序,matlab数组排序
  13. java/php/net/python大学生就业管理系统设计
  14. C语言-求绝对值-三目运算符
  15. Python生成器教程
  16. 修改webstorm的运行内存避免卡顿
  17. DAMA数据管理知识体系指南pdf
  18. 计算机歌曲夜空中最亮的星,抖音夜空中最亮的星电视剧插曲歌曲介绍
  19. 吴恩达神经网络与深度学习——深度神经网络
  20. 怎么制作公司网页教程【网站制作】

热门文章

  1. 【Linux 内核】CFS 调度器 ④ ( 调度子系统组件模块 | 主调度器、周期性调度器 | 调度器类 )
  2. 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 二级指针排序 | 抽象业务逻辑函数 )
  3. 【Android 逆向】Android 权限 ( ro.product.cpu.abi 属性 | ro.zygote 属性 | dhcp.eth0 属性 | net.* 属性 )
  4. 【Android 启动过程】Activity 启动源码分析 ( ActivityThread 流程分析 二 )
  5. 【Android 文件管理】分区存储 ( MediaStore 文件操作 )
  6. 我的 Serverless 实战 — 云函数与触发器的创建与使用 ( 开通腾讯云 “ 云开发 “ 服务 | 创建云函数 | 创建触发器 | 测试触发器 )
  7. 【Android 安全】DEX 加密 ( Application 替换 | 分析 BroadcastReceiver 组件中调用 getApplication() 获取的 Application )
  8. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 解压 apk 文件 | 判定是否是第一次启动 | 递归删除文件操作 | 解压 Zip 文件操作 )
  9. Ticker 未释放导致的 CPU 占用过高
  10. [Spring cloud 一步步实现广告系统] 20. 系统运行测试