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. Effective Java 05 Avoid creating unnecessary objects

    String s = new String("stringette"); // Don't do this. This will create an object each tim ...

  2. 在VS项目中使用SVN版本号作为编译版本号

    在实际项目中(特别是作为产品的项目),版本号是必不可少的一部分.版本号的规则也有许多种,在此不讨论具体的编码规范.对于迭代的产品,版本繁多,特别是有多个实施项目所使用产品的版本不同(基于定制需求)时, ...

  3. ASP.NET 使用Ajax(转)

    之前在Ajax初步理解中介绍了对Ajax的初步理解,本文将介绍在ASP.NET中如何方便使用Ajax,第一种当然是使用jQuery的ajax,功能强大而且操作简单方便,第二种是使用.NET封装好的Sc ...

  4. session实现购物系统的简例和application实现统计页面访问次数的简例

    login.jsp <body>  <form action="checkLogin.jsp">  <table>  <tr>< ...

  5. 为什么QQ浏览器不是默认浏览器但是在打开网页的时候还是默认启动?

    因需要浏览器兼容性测试装了一个QQ浏览器,我将火狐设为默认浏览器,但是每次打开连接的时候都是启动QQ浏览器. 出现这样的情况有以下两种可能:1.取消QQ为默认浏览器打开的设置项未成功,若需要取消QQ为 ...

  6. .NET三层架构例子超链接可以点击显示内容页面

    在研究了一个星期的三层架构写出的一个小功能,使用三层架构并实现点击新闻标题可以跳转到自己写的新闻页面. 首先是一个DBHelper,这个不是我自己写的,是朋友给我的 using System; usi ...

  7. linux指定账号下配置单独的jdk版本

    1.下载tar.gz格式的安装包,上传到服务器,并解压,本例使用jdk-7u79-linux-i586.tar.gz 2.进入指定账户的目录下, vi  .bashrc,添加环境变量并保存:     ...

  8. 详解apache的allow和deny

    今天看了一篇关于apache allow,deny的文章收获匪浅,防止被删,我直接摘过来了,原文地址!!! !http://www.cnblogs.com/top5/archive/2009/09/2 ...

  9. Solr字段配置错误

    在站内搜索Solr Schema设计时,有个FTS_URL字段(之前设计url也会参与检索和打分),因此其配置信息如下: <field name="FTS_URL" type ...

  10. jquery 地址栏链接与a标签链接匹配 特效代码总结(二)

    如题所述,当出现这样的功能,点击某个链接后,给跳转后的该链接地址添加样式,通过添加class为current来增加特殊样式. 如图所示:点击HTML+css3跳转后,给其添加如图样式: js代码如下: ...