文档章节

也说 Java 异常处理

编走编想
 编走编想
发布于 2013/06/03 20:51
字数 1005
阅读 554
收藏 16

Java 异常看似很简单,但是很多 Java 新手总是掌握不了,而很多做了多年的 Java 开发人员也拿捏不住。今天看到论坛里有人问关于 Java 异常处理的问题,就觉得这个话题还是值得一写。

Checked Exception 和 RuntimeException

Java 中的异常分为两种,一种是 Checked Exception,另一种是 Runtime Exception。前者的含义是虽然是异常情况,但是可以事先预料。比如用户请求的文件不存在,就会导致 FileNotFoundException。这个时候,你的系统可以通过提示用户其文件路径错误的方式来处理这个异常。后者往往代表着系统在正常运行过程中不应当出现的异常,并且系统无法自行修复的异常。例如,最常见的就是 NPE,出现这种异常往往代表系统设计有缺陷或代码存在 bug。

但并非所有的 RuntimeException 都不需要 try-catch 处理,也并非所有 CheckedException 都可以通过更多的代码让程序自行修复。例如,Integer.parseInt 等方法就会抛出 NumberFormatException,它是运行时异常。这个异常通常是用户输入的数据不符合数字的格式,这时最好是让用户重新输入,所以最好 try-catch 处理。

再例如,使用 JAXB 时必要要处理 JAXBException,这是一个 Checked Exception,出现这种异常往往是找不到 JAXB 实现(因为类加载等原因),JAXB Annotation 使用错误等。这些问题在一个正常的系统中是不应当出现的,而出现时通常便意味着 bug。所以这种异常通常只需 try-catch 后加 log 处理,而更好的方式是它是一个 Runtime Exception(但这基本是不可能的)

其实,JDK 及 Java EE 等混乱的 Checked Exception 和 RuntimeException 使用方式也颇让人诟病。所以在 Groovy 中(其它 JVM 语言不了解)索性去掉了 Checked Exception 这个概念以简化程序编写 (在 Groovy 中你不需要 try-catch 一个 Checked Exception)

如何处理异常

这个问题说起来也很简单。如果当前方法不知道如何处理某个异常,或者不应当由这一层程序处理时,就应当抛出异常,由上层调用者处理。如果某个异常(例如 JAXBException)各层都无法处理时,应当在它出现的时候就解决掉,方法通常是捕获异常,记录日志,或者封装成运行时异常抛出,但要确保上层会处理这个运行时异常(通常 Web 服务器等的至少会通过日志的方式处理)

虽然上述方法适合多数情况,但是对于某些异常,处理起来并不简单。例如,SQLException,你可能还需要根据 ErrorCode 来选择不同的处理方式(好在想 Spring、Hibernate 等框架帮我们做了这事)

自定义异常

出了要处理由 JDK 或第三方类库、框架抛出的异常意外,一个系统通常会有很多自定义的异常。这些异常往往代表业务异常的情况,通过自定义的异常使得代码和系统的行为更加清晰。自定义的异常可以是Checked Exception,也能是 Runtime Exception。前者通常用于通知上层调用者做适当的异常处理,后者通常用于由系统的某一层(通常是表现层或接口层)做统一的异常处理。

中断异常

线程中断异常(InterruptedException)是当前线程被中断的表现之一。遇到这个异常时,如果你不知道如何处理,你应当向上抛出。但如果碰巧你不能抛出(例如在 Runnable 中遇到),你就应当捕获 InterruptedException 之后再重新设置中断,方法是执行 Thread.currentThread().interrupt()。吞掉中断而不处理往往会导致在测试中不容易发现的问题。

© 著作权归作者所有

共有 人打赏支持
编走编想
粉丝 150
博文 128
码字总数 111395
作品 0
海淀
程序员
私信 提问
加载中

评论(1)

优雅先生
优雅先生
不够详细
Java学习系列文章:说说Java中的异常

在正常的程序设计中,程序异常处理是非常关键和重要的一部分。试想一个项目中没有一个好的异常处理,这个项目会怎么样? 什么是异常 异常其实是程序上的错误,包括程序逻辑错误和系统错误。比...

java高级架构牛人
2018/06/29
0
0
Java的Exception和Error面试题10问10答

在Java核心知识的面试中,你总能碰到关于 处理Exception和Error的面试题。Exception处理是Java应用开发中一个非常重要的方面,也是编写强健而稳定的Java程序的关键,这自然使它成为面试题中的...

lwei
2013/10/10
18.2K
48
尝试Java,从入门到Kotlin

之前一直使用C#开发,最近由于眼馋Java生态环境,并借着工作服务化改造的契机,直接将新项目的开发都转到Java上去。积攒些Java开发经验,应该对.NET开发也会有所启发和益处。 欢迎工作一到八...

编程SHA
2018/12/03
0
0
王垠:Kotlin 和 Checked Exception

最近 JetBrains 的 Kotlin 语言忽然成了热门话题。国内小编们传言说,Kotlin 取代了 Java,成为了 Android 的“钦定语言”,很多人听了之后热血沸腾。初学者们也开始注意到 Kotlin,问出各种...

程序师
2018/08/14
0
0
热闹背后的冷静思考:Kotlin 和 Checked Exception

本文转载自当然我在扯淡,原文《Kotlin 和 Checked Exception》,作者:王垠。文章转载已获授权。 最近 JetBrains 的 Kotlin 语言忽然成了热门话题。国内小编们传言说,Kotlin 取代了 Java,...

局长
2017/05/24
4.5K
90

没有更多内容

加载失败,请刷新页面

加载更多

html5代码书写规范

DOCTYPE 页面文档类型统一使用HTML5 DOCTYPE. <!DOCTYPE html> Meta字符集设置 声明方法遵循HTML5的规范, Meta文件使用 "UTF-8" 浏览器显示编码指定. <meta charset="utf-8"> 手机端页面添......

niuhongxia
27分钟前
3
0
怎么修改 phpstorm 中注释的开始位置

PHPStorm 版本:v2018.3 如下图设置:

whoru
36分钟前
2
0
Android Arcface人脸识别sdk使用工具类

public class FaceUtil{ private static final String TAG = FaceUtil.class.getSimpleName(); private static FaceUtil faceInstance = null; public FaceDB mFaceDB; pri......

是哇兴哥棒棒哒
44分钟前
2
0
JFreeChart中文API和树形详解

-------------------------------- JfreeChart 中文API -------------------------------- 要想绘制出漂亮的图表,就必须了解图表的构成部分,将图表进行分解成N个部分。 然后再对每一个部分...

喜欢搬砖的农民工
45分钟前
2
0
Android ViewPager

1.PagerAdapter { public int getCount() { return list.size(); } public Object instantiateItem(ViewGroup container, int postion) { container.addView(iv); return iv; } public void ......

Coding缘
47分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部