java异常处理简析

1- try

将可预见可能抛出异常的代码包含在try语句块中,也就是将一些会抛出异常的方法调用放在这个语句块,以便后续处理

2- 异常

  1. Throwable

错误和异常的超类(Error和Exception都继承自Throwable),包含了其线程创建时线程执行堆栈的快照,通过printStackTrace()方法打印堆栈跟踪数据信息。

  1. Exception

被检查异常的顶级类,** 除了RuntimeException ,Exception类型的异常编译器会检查这种异常,需要对应的异常处理 **,否则会因为异常抛出导致程序异常终止,我们在开发的时候主要就是捕获这种异常。

  1. RuntimeException

** 运行时被检查异常,继承自Exception,但是这种异常发生在虚拟机运行期间,编译器不会检查这种异常 ,如果我们调用的方法可能抛出RuntimeException 类型的异常,但是并没有相应的try/catch进行处理,最后能通过编译,是因为编译器并不会在编译期间对这种异常进行检查。 如果代码会产生RuntimeException,则需要调整代码进行避免 **,如 ** ArithmeticException **

  1. Error

继承自Throwable,** 编译器不会对错误进行检查 **。用于指示严重错误的发生,说明已经发生了无法挽回的错误,程序无法修复这种错误,直接导致程序因为错误而终止。如 ** VirtualMachineError **

** 下面重点介绍Exception类型的常用异常 **

以下都是Exception的子类,表示特定的用途

  1. IllegalArgumentException 参数的值不合适
  2. IllegalStateException 参数的状态不合适
  3. NullPointerException 在null被禁止的情况下参数值为null
  4. IndexOutOfBoundsException 下标越界
  5. ConcurrentModificationException 在禁止并发修改的情况下,对象检测到并发修改
  6. UnsupportedOperationException 对象不支持客户请求的方法

3- catch

捕获try语句块中的Exception异常,并进行相应的处理
1)编译的时候有些异常的捕获,如Exception,IllegalStateException,NullPointerException等(java.lang包的异常)并不要求try语句中含有抛出异常的方法调用;
2)但是有些异常的捕获如ObjectStreamException,IOException等(java.io包的异常)并要求try语句中必须含有抛出异常的方法调用,否则编译错误

  1. 一个try语句块可以有多个catch子句来捕获不同的异常,但是** 同时只能捕获一个异常, 在异常发生的代码段,后续的代码得不到执行 **,转而执行对应的catch子句,并正常退出方法的调用。
    例子如下:
例子1
  1. 通过捕获异常的超类来捕获
    例子如下:
例子2
  1. catch中如果没有捕获到抛出的异常,则继续向上级调用者抛出异常
    例子如下:
例子3

4- throw 和 throws

** throw **

用于在方法体内抛出异常,如果方法内部抛出异常,则此方法声明上可以通过throws声明抛出的异常,也可以什么都不声明,对抛出的异常并没有什么影响。
比如


例子4

** throws **

用于方法声明上,声明可能抛出的异常,见例子4

需要注意的是异常声明在继承时多态隐含的关系(** 对父类方法进行方法重写 ),虽然 异常声明不是方法签名的一部分 **

  1. ** 如果父类的方法没有声明抛出异常,子类覆盖的方法也不能声明抛出任何异常。**
  2. ** 如果父类的方法声明抛出特定异常E,子类覆盖的方法要么不声明抛出任何异常,要么声明抛出E异常或者E异常的子类(隐含的继承关系)。**

5- finally

表示的不管try方法块是正常执行完毕,还是抛出异常退出try语句块,finally都会在程序离开try语句块后执行,用来做最后的资源回收等操作。

  1. ** try中的return,catch中的return,finally中的return **
例子5

从中可以看出finally的return最终会覆盖try中的return语句,catch中没有捕获到异常,没有得到执行,** finally > catch > try 按照等级对return进行覆盖 **。

  1. ** try中的System.exit() **
例子6

** 当try执行System.exit(0/1)都将立马退出程序,finally中的内容是得不到执行的。 **

  1. 守护进程中的finally

守护进程与finally

  1. ** try/finally组合 **

例子7

setObj方法抛出异常,tryFinally方法调用setObj,并没有捕获异常,而是由tryFinally上级调用main方法来捕获,但是如果main方法没有捕获,则会因为异常抛出而没有处理而异常终止程序,参见AQS的acquireQueued方法

总结

避免将异常处理用于流程控制,也不能频繁的检查捕获不必要的异常,因为频繁异常的捕获和抛出(获取抛出异常线程的堆栈信息等操作)将消耗大量的系统性能,而且抛出的异常应尽量使用标准的异常类,来做到明确表达异常的含义。

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

推荐阅读更多精彩内容

  • 通俗编程——白话JAVA异常机制 - 代码之道,编程之法 - 博客频道 - CSDN.NEThttp://blog...
    葡萄喃喃呓语阅读 3,158评论 0 25
  • Java异常类型 所有异常类型都是Throwable的子类,Throwable把异常分成两个不同分支的子类Erro...
    予别她阅读 915评论 0 2
  • 初识异常(Exception) 比如我们在取数组里面的某个值得时候,经常会出现定义的取值范围超过了数组的大小,那么...
    iDaniel阅读 1,863评论 1 2
  • 有朋友三年前就推荐这个电影给我,但是一直没有看。为了交剪辑群影评,终于打开了这部电影。 看到电影名,七号房的礼物,...
    小饼干310阅读 807评论 0 1
  • 1. 感恩猴年一切顺顺利利。 2. 感恩准备早餐的素食档。 3. 感恩带来特别讯息的陌生大哥。 4. 感恩可以看到...
    jaychua阅读 92评论 0 0