

猫头鹰的深夜翻译:趣谈Java Exception
source link: https://segmentfault.com/a/1190000040765019
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Java异常类(Exception)是用来处理异常程序行为的一组类。在这篇文章中,我将介绍如何使用Java异常类,以及在程序中如何设计Java异常体系。Exception类是Java体系中非常重要的一环,每一个程序员都必须熟悉并掌握它。
Java异常承载的信息量超乎你的想象
Java Exception的结构设计本身就可以提供给开发者非常多的信息(如果开发者可以恰当的利用这一结构)。Exception结构如下图所示:
Throwable
是整个异常结构的父类,它有两个子类,分别是Error
和Exception
Java Error
Error
类代表出现非正常场景,一旦Error
异常出现,整个应用程序可能崩溃。
Java Exception
Exception
和Error
类不同,当这种类型的异常出现时,程序是可以尝试恢复并继续运行的。Exception异常有以下两类,运行时异常(Runtime Exception)和非运行时异常(Not Runtime Exception):
非运行时异常也成为checked异常,这一类异常和Error异常非常类似,二者的区别在于程序在抛出checked exception有更高的几率恢复正常。
Checked 和 Unchecked异常
Checked异常强制开发者在程序中进行处理或再次抛出。如果checked异常被重新抛出,则需要在方法中用throws语法声明该异常。与之相反,Unchecked异常不需要特殊处理。这种设计结构意味着不主动处理的unchecked异常将会被抛到根类。
如何在JAVA中进行异常处理
Java中有两种方式处理异常:在当前方法中处理或者是重新抛出。你可能需要一个父异常处理器,或者是执行一些其它特定逻辑,如进行重试。
如上文所示,我们可以将异常拆分成三类:Checked,Runtime和Error。它们分别在不同的场景下抛出,代表程序可以恢复的程度。最乐观的是Checked异常,Runtime异常相对而言可恢复的可能性更小,最糟糕的是Error类型异常。
在了解了异常的类型后,我们就可以试着回答以下问题:
- 程序当前情况有多糟糕? 问题的原因是什么?
- 如何修复问题?
- 需要重启JVM吗?
- 需要重新编写代码吗?
熟悉异常后意味着我们可以推测程序是哪里出现了问题,并且试着修复它。下面的章节会展示几个经典的异常场景并分析原因(假设程序已经通过了编译自测阶段)
<!-- more -->
分析Error异常
先从最严重的Error异常说起。最常见的Error异常如下图所示:
在大多数情况下,你只需要修改JVM的配置或者添加缺少的依赖。当然,也有少部分场景需要对代码进行优化。
分析Checked异常
对于Checked异常,它通常代表着程序有可能用某种方式从这种异常中恢复过来,比如重试。下文将会给出几个比较经典的Checked异常,其中有些异常可能是另一些异常的父类,在此将无视这些异常中的关联进行分析。
所以,这张表说明了什么呢?如果你仔细观察,会发现大多数情况下不需要去修改代码,甚至不需要去重启应用程序。
分析Runtime异常
Runtime异常是最常见的异常。通常来说Checked和Error异常并不需要代码变更,但是Runtime异常通常意味着必须修改代码才能修复这个问题。下面的表格展示了最常见的Runtime异常:
可见Runtime异常会对程序带来多大的伤害。它是那个导致代码修复,程序员压力陡增和商业损失的罪魁祸首。
Checked异常导致的代码污染
根据Checked异常的定义,开发者应该将每一个可恢复的问题通过Checked异常抛出。但是这同时意味着需要在方法定义中强制声明这个异常,以及调用方必须额外增加三四行try-catch逻辑来对这个异常进行处理。如果程序中到处充斥着这样的代码片段,会极大影响代码的可读性。因此,我更推荐使用RuntimeException进行异常管理。即便是在设计API时,也可以通过在方法中定义Runtime异常加上注释辅助调用方理解。而API调用方则可以自己决定是否要处理这个异常还是继续向上抛出。
原文链接: dzone.com/articles/java-exceptions-1
Recommend
-
70
猫头鹰的深夜翻译:JAVA8 API设计准则
-
50
猫头鹰的深夜翻译:在JAVA中记录日志的十个小建议
-
65
导读 人工智能和区块链作为当今互联网风口代表,颇为博人眼球。有人形象地称其为“生产力”和“生产关系”,这是因为人工智能可以优化社会资源配置,提升生产效率,而区块链则能够建立起全新的基础信任法则。 那么,作为另一大技术风口的...
-
32
作为一篇趣谈,这篇文章不打算太过深入的分析ThreadLocal内部机制。 只希望通过一种有趣的方式,让大家了解ThreadLocal的两大用途: 实现线程安全; 保存线程上下文信息
-
98
比特科技 关注我们,即时收到优秀面经/面试题/技术博文及IT最新资讯
-
13
最近伊朗又成了国际热点话题,美国和伊朗下来会怎么做,也成了大家关注的焦点。 通常,大家关心的都是双方会出动什么武器,攻击对方...
-
13
导读 在第二节,我们学习了Gin框架的路由定义与参数接收,今天应一位同学的要求,来讲解一下参数的绑定与校验。 为什么校验参数? 本不必抛出这个问题的,但顾及到初出茅庐的同学,这里解释一下。
-
17
趣谈HmacSHA1和原生SHA1的区别 suncle · 大约2小时之前 · 10 次点击 · 预计阅读时间 3 分钟 · 不到1分钟之前 开始浏览
-
15
大多数程序员在日常开发中常常会碰到 GC 的问题:OOM 异常、GC 停顿等,这些异常直接导致糟糕的用户体验,如果不能得到及时处理,还会严重影响应用程序的性能。本系列从 GC 的基础入手,逐步帮助读者熟悉 GC 各种技术及问题根源。 GC 的由来
-
3
高效的时间管理是大部分成功的软件工程师具备的能力。它能够帮助你在职业生涯上快速进步,而不是每个敏捷迭代末疯狂加班。每个企业都试图通过自动化流水线,升级版IDE和DevOps来降低成本提高效能。而通过避免以下六种低效陷阱可以让你的领先一步,收获高...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK