java 异常处理知识点

摘要:

  1. 记录看书过程中,看到的知识点,简单梳理,以供反复查看

基类

Exception 继承自 Throwable,是所有异常类(~Exception)的父类。 Exception 有四个构造函数,一般所有的异常类都有两个标准的构造函数:

  • 默认构造函数(无参数)
  • 以一个 string 为参数的构造函数。 这个字符串可以通过调用 getMessage() 方法获取。

创建异常类

我们创建的异常类需要继承 Exception 类或者其子类, 或者继承自 Throwable 类。

一般创建异常类的话,要起好名字,做到“望文生义”:

class SimpleException extends Exception {}

这样一来会自动的为我们的异常类添加一个默认的构造函数。如果需要的话, 也可以自己在添加一个以 string 为参数的构造函数。

class SimpleException exends Exception {
    public SimpleException() {}
    public SimpleException(String s) {
        super(msg);
    }
}

Exception 类中方法简介

  1. getMessage() | getLocalizedMessage() 返回关于此类的详细信息。

    • getMessage() 返回的就是异常构造时的那个 message,如果没有此 message,则返回的是 null
    • getLocalizedMessage() 方法就是直接调用了 getMessage(),返回的值相同。但是这个方法适用于 Exception 的子类重写的,如果重写了,则会返回不同值。
  2. void printStackTrace() 在标准输出错误流中打印此报错方法的调用栈,可以看到我们是如何从主函数一步一步的走到这个方法的异常代码部分。

  3. StackTraceElement[] getStackTrace() 获取此异常方法的调用栈帧,组成一个数组返回。

捕获异常

使用 try...catch... 语句捕获异常,如下:

try {
    // 运行的代码
} catch(ExceptionType1 e1) {
    // 关于处理此类型异常的代码
} catch(ExceptionType2 e2) {
    // 关于处理此类型异常的代码
} finally {
    // 一定会执行的代码
}
  1. try 语句中的代码是我们想要执行的逻辑代码,但是在执行的过程中可能会出错。一旦出错,出错行之后的代码不再执行,进入 catch 语句。
  2. catch 语句是用来捕获异常并处理,就像函数定义一样,但是它只有一个参数。
  3. finally 是一定会执行的代码, 不论 try 中调用 return, break, continue 都会执行这部分的代码(try 中,如果 return, break, continue 之后还有程序,编译器报错)。
  4. 如果 try 语句中有返回语句,而返回的值在 finally 中被修改了。 如果运行的过程中没报错,会返回 try 中的返回值, finally 对最后的返回值没有影响。

注意:

  1. catch 语句会按照顺序匹配查找
  2. 一旦某个 catch 语句匹配上了,就进入此 catch,执行完后,下面的所有 catch 语句都不会再执行了。
  3. catch 语句中,如果一个父类异常排在子类异常的前面,也会报错,因为这个子类异常不可抵达,相当于无用。
  4. 如果在 try 主体中确定不会抛出某一类型的异常,此异常就不能出现在 catch 语句中,否则会编译报错。

重新抛出异常

在使用 catch 语句捕获异常后,因为某些原因,我们需要将这个异常重新抛出。重新抛出异常后,就不会被此 try...catch...语句剩余的 catch 语句捕获,而是被其上一层的异常处理语句捕获(调用此函数的异常处理机制)。

简单重抛异常

// some code
try {
    // some code
} catch(Exception e) {
    // some code
    throw e;
}
//  some code

这样重新抛出的异常,被其他方法捕获后,使用 printStackTrace() 打印出的调用栈与原异常相同。即重新抛出不会改变异常。

调用 fillInStackTrace() 改变函数调用栈

// some code
try {
    // some code
} catch(Exception e) {
    // some code
    throw (Exception)e.filInlStackTrace();
}
//  some code

fillInStackTrace() 调用的地方就是新的异常发生的地方。

也可以重新抛出改变类型的异常

这样的话,相当于抛出了新的异常,关于原始异常的一切都会消失,貌似没有出现此异常一般。

异常声明 exception specification

在 java 中,当我们定义一个方法时,如果这个方法内部使用 throw 抛出异常,则此方法必须添加异常声明,告诉其他人,这个方法在调用的过程中可能会抛出哪些异常。例如:

// 此方法会抛出三个异常
public void f() throws TooBigException, ToSmallException, DivZeroException {
    // 方法实现
}

// 此方法不会抛出异常
public void f() {
    // 方法实现
}

注意:

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

推荐阅读更多精彩内容

  • 八、深入理解java异常处理机制 引子try…catch…finally恐怕是大家再熟悉不过的语句了, 你的答案是...
    壹点零阅读 1,516评论 0 0
  • 引言 在程序运行过程中(注意是运行阶段,程序可以通过编译),如果JVM检测出一个不可能执行的操作,就会出现运行时错...
    Steven1997阅读 2,385评论 1 6
  • 大概带看不看的也看了摸索了几个月的VUEX了,很赞同知乎上一个帅哥的总结,VUEX就是一个前端数据库。特别适合存放...
    北方蜘蛛阅读 976评论 2 0
  • 前一段时间有点高产,可能是因为从来没写过文章,心里好多话一下子写了出来感觉既爽快又空虚,突然感觉自己被榨干了一样(...
    陌生小姐阅读 304评论 1 1
  • 文|米励 本文原创 2018年的一月份已经过去了大半,你是否已经对17年进行了复盘?趁着17年还未走的太远,我回望...
    米励阅读 401评论 2 11