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. 【CSharp】C#开发ActiveX插件

    这几天Web项目中需要用到ActiveX插件(PS:听说这个是好久好久的东西了...),由于项目中需要调用本地资源所以只能研究研究这位老兄了. 先说说自己学习他的经历,开始的时候是用百度引擎检索自己所 ...

  2. oracle REGEXP_SUBSTR函数

    REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier) __srcst ...

  3. maven 的 pom.xml 文件报错:ArtifactTransferException: Failure to transfer

    因为maven下载依赖jar包时,特别慢,所以取消了下载过程,再次打开eclipse时,maven的pom.xml文件报错如下: ArtifactTransferException: Failure ...

  4. 【nginx】配置文件的优化

    1.编译安装过程优化 在编译Nginx时,默认以debug模式进行,而在debug模式下会插入很多跟踪和ASSERT之类的信息,编译完成后,一个Nginx要有好几兆字节.在编译前取消Nginx的deb ...

  5. Ubuntu文本编辑时vi和nano命令的区别(建议使用nano)

    vi是Unix世界里极为普遍的全荧幕文书编辑器,几乎可以说任何一台Unix机器都会提供这套软体就像windows的记事本一样. 键入 vi /etc/hosts 进入vi界面,把光标移动到文件未尾.按 ...

  6. 手机远程调试工具spy-debugger

    关于spy-debugger   1.一站式页面调试工具,远程调试任何手机浏览器页面,任何手机移动端webview(如:微信,HybirdApp等)HTTP/HTTPS.2.spy-debugger内 ...

  7. HBase 高性能加入数据 - 按批多“粮仓”式解决办法

    摘要:如何从HBase中的海量数据中,以很快的速度的获取大批量数据,这一议题已经在<HBase 高性能获取数据>(http://www.cnblogs.com/wgp13x/p/42451 ...

  8. 利用模板在RM里部署VM

    Refer to: https://www.azure.cn/documentation/articles/virtual-machines-windows-ps-template/ 过程中遇到的几个 ...

  9. Android Studio调试功能使用总结【转】

    Android Studio调试功能使用总结[转]   这段时间一直在使用Intellij IDEA, 今天把调试区工具的使用方法记录于此. 先编译好要调试的程序. 1.设置断点 选定要设置断点的代码 ...

  10. java :hello world

    练习java的基本语法. output hellow world. 需求:打包自身项目的bin目录文件为一个临时可运行的jar文件,执行完后删除. 使用process执行jar文件,返回输入流和错误流 ...