11.1.1 异常分类

    如果一个程序出现了RuntimeException,那么就一定是你的问题。


11.1.2 声明已检测异常
    如果子类覆盖了父类的一个方法,那么子类方法中声明的检查异常不能比超类方法中声明的异常更通用。

11.1.4 创建异常类
    所有自定义的异常类,都应该实现两个构造函数,一个是默认构造函数;一个是带string参数的构造函数;

11.2 捕获异常
    通常来说应该捕获那些知道如何处理的异常,而将那些不知道如何处理的异常继续进行传递。

11.2.1 捕获多个异常
    在java7中,同一个catch语句可以捕获多个异常,比如:
  1. try{
  2. ....
  3. }catch(FileNotFoundException | UnknownHostException){
  4. ...
  5. }
    只有当捕获的异常类彼此之间不存在父子关系的时候才需要这种方法。

11.2.2 再次抛出异常或者异常链
    将原始异常设置为新异常的原因。
  1. try{
  2. ...
  3. }catch(Exception e){
  4. Throwable se = new ServetException("database error: ");
  5. se.initCause(e);
  6. throw se;
  7. }
当捕获异常时,就可以使用Throwable se = e.getCause();来得到原始异常。

11.2.4 带资源的try语句
    一看语法就知道,这个和c#中的using语句是一样的
  1. try(Resources res = ){
  2. work with this res
  3. }
try块退出时,会自动调用res.close()语句。(在c#中是调用res.dispose()方法)

比如下面的两端代码是等价的
  1. FileInputStream fs=null;
  2. try{
  3. fs = new FileInputStream("D:\test.txt");
  4. fs.xxxxx
  5. }
  6. finally{
  7. if(fs != null) fs.close();
  8. }
  1. try(FileInputStream fs= new FileInputStream("D:\test.txt")){
  2. fs.xxxx
  3. }
显然,第二段代码简洁很多。

而且在try块中可以定义多个资源,逗号分隔,然后编译器会自动调用所有资源的close()方法。

11.2.5 分析堆栈跟踪信息
  1. Throwable t = new Throwable();
  2. StackTraceElement[] frames = t.getStackTrace();
  3. for(StackTraceElement frame : frames){
  4. //xxxxx
  5. }
通过StackTraceElement可以获取到对应的文件名称、错误的行号、类名、方法名等信息,这样可以更加方便的分析和调试一问题。

下面的方法可以获取当前应用程序的所有线程的堆栈信息,这个在以前用c#的时候没有看到过,这也从侧面看出多学习不同语言的重要性。
  1. Map<Thread, StackTraceElement[]> map = Thread.getAllStackTrace();
  2. for(Thread t: map.keys()){
  3. StackTraceElement frames = map.get(t);
  4. analyze frame
  5. }

StackTraceElement  的几个典型方法
  1. String getFileName();
  2. int getLineNumber();
  3. String getClassName();
  4. String getMethodName();
  5. boolean isNativeMethod();
  6. String toString();

11.3 使用异常的技巧
1)异常处理不能代替简单的测试,也就是不要用异常来做程序判断的分支;
2)要适当的利用异常层次结构,抛出或者捕获的时候,要尽量使用能够表达特定目的的类,这样会具有更好的可读性,不要任何时候都使用Throwable,那样可读性很差的;
3)在检测错误的时候,“苛刻”比放任更好;比如Stack.pop()是返回null更好还是跑出EmptyStackException更好?作者认为后者更好。
4)不要羞于传递异常。如果调用了一个跑出异常的方法,例如FileInputSteam构造器或者readLine方法,这些方法就会本能地捕获这些可能产生的异常。其实传递异常比捕获异常更好。
  1. public void readStuff(Sting fileName) throw s IOException{
  2. InputStream is = new FileInputStream(fileName);
  3. //xxxx
  4. }
让高层次的用户知道发生了错误,或者放弃不成功的命令更加合适。

那么以上两点就可以归纳为:早抛出,晚捕获。



Java系列:《Java核心技术 卷一》学习笔记,cchapter11 异常的更多相关文章

  1. 我爱Java系列之《JavaEE学习笔记day12》---【缓冲流、转换流、序列/反序列化流、打印流】

    [缓冲流.转换流.序列/反序列化流.打印流] 一.缓冲流 1.字节缓冲输出流 java.io.BufferedOutputStream extends OutputStream 高效字节输出流 写入文 ...

  2. 《Java多线程编程核心技术》学习笔记

    第2章 对象及变量的并发访问 2.1 synchronized同步方法 方法内的变量为线程安全: 方法内部的变量是线程私有的 方法中有一个变量num,后面对它赋值 两个线程同时调用这个方法,对其赋不同 ...

  3. Java web与web gis学习笔记(二)——百度地图API调用

    系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...

  4. Java web与web gis学习笔记(一)——Tomcat环境搭建

    系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...

  5. Java程序猿的JavaScript学习笔记(汇总文件夹)

    最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...

  6. Java程序猿的JavaScript学习笔记(8——jQuery选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  7. Java程序猿的JavaScript学习笔记(3——this/call/apply)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  8. Java程序猿的JavaScript学习笔记(1——理念)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  9. Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  10. Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

随机推荐

  1. win7下安装tomcat

    安装个tomcat都一波三折,网上资料安装方法参差不齐,看多了反而晕,记录下自己安装的过程,便于以后翻阅. 选择哪个版本? tomcat 8要求JDK7以上, 想安装8的需要先确认下自己JDK版本(j ...

  2. java网络---基本web概念

    首先需要搞清楚web中的3个关键概念. 一.HTTP,HTML,URL. HTML 全称是Hypertext Markup Language,是用来描述一个网页的语言.或者说,该语言是用来描述网页的“ ...

  3. linux下批量修改存有超大数据量IP文件中的IP内容以及去重排序

    作为一个linux的学徒,分享一下自己解决这个小问题的心得,在处理这个问题时使用了一个小技巧感觉很适用,个人发觉linux的终端真滴是非常强大,下面就详细地介绍这个问题以及解决办法吧 问题描述:由于要 ...

  4. WCF使用net.tcp寄宿到IIS中(转)

    一.IIS部分 环境:Windows Server 2008 R2 1.安装WAS,如下图所示:   2.网站net.tcp协议绑定,如下图所示:   3.网站启用net.tcp,如下图所示:   二 ...

  5. linux常用查看日志命令

    转自:http://yinfeifei.iteye.com/blog/779217 1.cat命令: 功能:1)显示整个文件. 示例: $ cat fileName 2)把文件串连接后传到基本输出,如 ...

  6. javascript特效实现(4)——当前时间和倒计时效果

    这个效果的实现关键是对Date对象和setTimeout的使用. 一共有三个例子,HTML结构如下,就不添加CSS样式了. <body> 当前时间:<p id="p1&qu ...

  7. Azure CDN 启用HTTPS

    默认情况下,订阅里的CDN不支持HTTPS 需要联系21v,提交工单告知订阅号,由后台为订阅启用CDN的HTTPS功能. 然后就可以在创建CDN时选到HTTPS的选项了.

  8. 使用selenium实现右键另存为保存文件

    1.需要借住autoit工具和Robot类,下载地址:https://www.autoitscript.com/site/autoit/downloads/ 2.autoit的使用不再详细讲解.如下图 ...

  9. 事件查看器常见ID代码解释

    ID 类型 来   源 代 表 的 意 义 举 例 解 释 信息 Serial 在验证 \Device\Serial1 是否确实是串行口时,系统检测到先进先出方式(fifo).将使用该方式. 错误 W ...

  10. [树莓派]安装node环境

    本文并非node的编译安装,据说这要花很长时间,所以一开始我就是拒绝的.本文展示的是如何部署ndoe的编译好的执行文件. node的官网上下载目录里本身就有针对arm的编译好的执行文件.地址在这里:h ...