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. iOS网络-02-数据解析(JSON与XML)

    数据交互格式 服务器返回给用户的数据,通常是以下两种方式: JSON XML JSON 一种轻量级的数据数据格式,体积比XML小,是服务器返回给移动端通常采用的格式 用使用JSON文件中的数据,需要对 ...

  2. GET/POST请求的使用《极客学院 --AFNetworking 2.x 网络解析详解--2》学习笔记

    AFNetworking是开源代码排名第一的开源库.  GET请求的请求正文 一般都是明文显示的,携带的数据量小. POST用于处理复杂的业务,并不用明文的请求,其实POST请求可以携带更多的参数,只 ...

  3. win10中文简体繁体切换快捷键

    win10中文简体繁体切换快捷键Ctrl+Shift+F

  4. 使用Httpclient来替代客户端的jsonp跨域解决方案

    最近接手一个项目,新项目需要调用老项目的接口,但是老项目和新项目不再同一个域名下,所以必须进行跨域调用了,但是老项目又不能进行任何修改,所以jsonp也无法解决了,于是想到了使用了Httpclient ...

  5. cxf开发Restful Web Services

    一.restful web services rest全称是Representation State Transfer(表述性状态转移).它是一种软件架构风格,只是提供了一组设计原则和约束条件.在re ...

  6. JavaScript中的不可见数据类型

    JS提供了一些内置对象.函数和构造器供我们编程,如Math.parseInt.Object.Array等.这些都是可见的,编程时可以使用的.比如我可以new Object 或 new Array. 有 ...

  7. splice()函数,'SPLICE_F_MOVE' 'SPLICE_F_NONBLOCK' 'SPLICE_F_MORE' undeclared

    1.编译含有splice()函数的程序时出现,'SPLICE_F_MOVE'  undeclared,'SPLICE_F_NONBLOCK' ‘SPLICE_F_MORE' 也是一样undeclare ...

  8. Git指令总结和图表

    Git 是一个很强大的分布式版本控制系统.它不但适用于管理大型开源软件的源代码,管理私人的文档和源代码也有很多优势. Git常用操作命令: 1) 远程仓库相关命令 检出仓库:$ git clone g ...

  9. mac 免密码登陆服务器

    由于mac os 是基于unix的操作系统终端和linux非常类似,所以不用借助类似于windows下的putty 和CRT工具即可远程登陆linux服务器,只需简单地3步即可免密码ssh远程. 1 ...

  10. Hadoop 2.0 中的资源管理框架 - YARN(Yet Another Resource Negotiator)

    1. Hadoop 2.0 中的资源管理 http://dongxicheng.org/mapreduce-nextgen/hadoop-1-and-2-resource-manage/ Hadoop ...