《JAVA编程思想》学习笔记:第12章(异常)

第十二章、异常

12.1 异常

异常允许我们(如果没有其他手段)强制程序停止运行,并告诉我们出现了什么问题,或者(理想状态下)强制程序处理问题,并返回到稳定状态。

12.2 终止与恢复

异常处理理论上有两种基本模型。

终止模型:

长久以来,尽管程序员们使用的操作系统支持恢复模型的异常处理,但他们最终还是转向使用类似“终止模型”的代码,并且忽略恢复行为。

Java支持终止模型(它是Java和C++所支持的模型)。这种模型假设错误非常关键,以至于程序无法返回到异常发生的地方继续执行。

恢复模型(Java支持):

意思是异常处理程序的工作是修正错误,然后重新尝试调用出问题的方法,并认为第二次能成功。

备注:Java场景举例:try-catch exception后,再执行新的代码流程(实现从错误中恢复)。

12.3 创建自定义异常

所有标准异常都有两个构造器:

1. 默认构造器;

2. 接受字符串作为参数,以便能把相关信息放入异常对象的构造器。--Java 建议告知用户异常的具体原因信息。

// FullConstructors.java

class MyException extends Exception{  //自定义Exception建议extends Exception

    public MyException(){} //默认构造器

}

public class FullConstructors{

    public static void g() throws MyException{ //如外抛异常的方法,需添加申明。

        System.out.println("Throwing MyException form g()");

        throw new MyException("Originated in g()"); //主动抛出异常

    }

    public static void main(String[] args){

        try{

            g();

        }catch(MyException e){ //捕获异常

            e.printStackTrace(System.out); //栈轨迹打印

        }

    }

}

12.4 printStackTrace()

Throwable类声明了printStackTrace()方法(栈轨迹打印),它将打印“从方法调用处直到异常抛出处”的方法调用序列。

12.5 为异常先占个位子

可以声明方法将抛出异常,实际上却不抛出。这样做的好处是,为异常先占个位子,以后就可以抛出这种异常而不用修改已有的代码。

在编译时被强制检查的异常称为被检查的异常。

12.6 异常链

异常链:常常会想要在捕获一个异常后抛出另一个异常,并且希望把原始异常的信息保存下来,这被称为异常链。

JDK1.4以后,所有Throwable的子类在构造器中都可以接受一个cause对象作为参数。这个cause就用来表示原始异常,这样通过把原始异常传递给新的异常,使得即使在当前位置创建并了新的异常,也能通过这个异常链追踪到异常最初发生的位置。

三种带cause参数的异常:

在Throwable的子类中,只有三种基本的异常提供了带cause参数的构造器:

Error:用于Java虚拟机报告系统错误。

Exception:

RuntimeException:运行时异常

12.7 受检&不受检异常

受检异常(Checked Exception):不可在编码中忽略(必须主动处理:要么throw要么try-catch)。--会由编译器强制实施编码检测。

不受检异常(UnChecked Exception):运行时异常,RuntimeException(及其子类)类型的异常,可以在代码中忽略,RuntimeException代表的是编程错误(编译器无法检测到异常原因)。

12.8 缺憾:异常丢失

用某些特殊的方式使用finally子句,可能会丢失异常,一种简单的丢失异常的方式是从finally子句中返回。

12.9 finally子句

try-catch-finally{}代码块:一定会执行:

a. 在异常没有被当前的异常处理程序捕获的情况下,异常处理机制也会在跳到更高一层的异常处理程序之前,执行finanlly子句。

b. 当涉及break和continue语句的时候,finally子句也会得到执行。

c. finally子句会在执行return语句前执行,即它总是会执行,所以在一个方法中, 可以从多个点返回,并且可以保证重要的清理工作仍旧会执行。

d. 应用场景:比如IO.closedQuietly().

12.10 异常的限制

a. 当要覆盖方法的时候,只能抛出在基类方法的异常说明里列出的那些异常。这个限制很有用,因为这意味着,当基类使用的代码应用到其派生类对象的时候,一样能够工作。

b. 此限制只针对普通方法有效,对构造器方法无效!

c. 不能基于throw exception的类型,来区分不同的重载方法。

12.11 构造器&异常

如果在构造器内抛出了异常,清理行为也许就不能正常工作了。--不建议在构造中throw Exception.

正确做法:嵌套使用try-catch.

12.12 异常匹配

抛出异常的时候,异常处理系统会按照代码的书写顺序抛出“最近”的处理程序。找到匹配的处理程序之后,它就认为异常将得到处理,然后就不再继续查找。

正确做法:先catch 派生类Exception,再catch基类Exception.

12.13 异常处理原则

a. "Harmful if swallowed" :不要直接吞食所有异常:

在知道如何处理Exception时,才主动catch,否则继续throw,由外层调用方负责处理。

b. 解决Exception后,再继续执行备选代码流程;

c. 只处理当前代码块的Exception,再throw其他异常(不属于当前流程的Exception),由外围代码继续处理。

12.14 总结

“报告”功能是异常的精髓所在。Java坚定地强调将所有的错误都以异常形式报告的这一事实,正是它远远超过诸如C++这类语言的长处之一,因为在C++这类语言中,需要以大量不同的方式来报告错误,或者根本就没有提供错误报告功能。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容