java通用异常_Java常用异常整理

填坑,整理下Java的常用异常。正确使用异常在实际编码中非常重要,但面试中的意义相对较小,因为对异常的理解和应用很难通过几句话或几行代码考查出来,不过我们至少应答出三点:异常类的继承关系、常用异常类、常用异常类的使用场景,下文将围绕这三点介绍。

异常类的继承关系

ef9c15c07b3a4458d940e1c7cf18b9f6.png

Java中,所有异常都继承自Throwable类(一个完整可用的类)。整体上分为Error、Exception两个大类,Exception大类又分为UncheckedException(继承于RuntimeException)和CheckedException(继承于Exception,但不继承于RuntimeException)。

为了帮助理解,我在每个类别下都给出了两个常用子类,如Error包括OutOfMemoryError、AssertionError等;UncheckedException包括NullPointerException、IllegalArgumentException;CheckedException包括IOException、InterruptedException。面试画异常类的继承关系时,要求能清楚的说明几个类别并分类别举几个常用的异常类。

常用异常类

下面分类别扩充一下常用的异常类,字典序排序:

类别

常用异常类

Error

AssertionError、OutOfMemoryError、StackOverflowError

UncheckedException

AlreadyBoundException、ClassCastException、ConcurrentModificationException、IllegalArgumentException、IllegalStateException、IndexOutOfBoundsException、JSONException、NullPointerException、SecurityException、UnsupportedOperationException

CheckedException

ClassNotFoundException、CloneNotSupportedException、FileAlreadyExistsException、FileNotFoundException、InterruptedException、IOException、SQLException、TimeoutException、UnknownHostException

需要着重理解的是UncheckedException。

上述异常类都是很常见的,但其中几个异常类设计的不好,需要注意:

ConcurrentModificationException:实现“快速失败”的机制,但实际上,“快速失败”机制本身仍然无法保证并发环境下安全性,参考源码|从源码分析非线程安全集合类的不安全迭代器。因此,虽然该异常很常见,不要去依赖它。

JSONException:常见于json字符串解析失败的情况,但遮蔽了大量的失败细节,往往很难根据该异常作出处理。如果项目中大量使用json,建议使用第三方的json解析库,如gson等。

UnsupportedOperationException:这是一种编码上的恶性妥协,经常在抽象类的成员方法中被用户主动抛出,表示该方法还未实现等,但由于是UncheckedException,运行期才能够发现,完全无益于编码期间的安全性。自己编码时尽量不要使用。

SQLException:与JSONException原因相似,但其遮蔽的失败细节范围更广。同时,SQLException还是一个CheckedException,在不能解决问题的情况下,又使代码变的臃肿不堪。建议同。如果做Java Web开发,热门的ORM库都能解决上述问题。

常用异常类的使用场景

常用异常还是有点多,下面分别讲解上述三个类别的使用场景,并在每个类别中选一个例子进行讲解。

Error

Error通常描述了系统级的错误,并且程序猿无法主动处理——当然,系统级错误也有可能由代码间接导致,这不在我们的讨论范围内。发生系统级错误的时候,系统环境已经不健康了,因此,Error不强制捕获或声明,也就是不强制处理,一般情况下只需要把异常信息记录下来(如果能记下当时的系统快照更好)。

OutOfMemoryError

当可用内存不足时,会由JVM抛出OutOfMemoryError。一般由三种原因导致:

堆设置过小,不满足正常的内存需求

代码中存在内存泄露,占用了大量内存而不能被回收

选择的GC算法与某些极端的应用场景不匹配,内存碎片过多,没有足够大的连续空间分配给对象

JVM抛出OutOfMemoryError前,会尝试进行一次Full GC,如果GC后可用内存还是不足,才会抛出OutOfMemoryError。因此,这时程序猿必然无法主动处理这一问题,只能等程序崩溃后再去查证原因。

查证OutOfMemoryError的技巧足以单开一篇文章了,本文不作深入。

UncheckedException

严格来说,Error也可以被划归UncheckedException,但我们更习惯用UncheckedException描述运行期发生,通常由于代码问题直接引起的程序相关的错误,并且程序猿无法主动处理。注意区分,系统级错误都应该用Error描述。UncheckedException发生的大部分情况是代码写挫了,因此,UncheckedException也不强制捕获或声明,也就是不强制处理,一般情况下记下日志即可。

不同的是,如果可能,要保证UncheckedException是可控的(在异常被动抛出前检查并主动抛出)。

JSONException就是不可控的。

NullPointerException

NullPointerException是最常见的UncheckedException。如果在一个空指针上引用方法或变量等,则运行期会抛出NullPointerException。空指针让程序变的不可控:如果任由空指针在程序运行期随意传递、使用,我们将无法确定程序的行为,也无法确定捕获NullPointerException时程序所处的状态。

解决这一问题的方法很简单:

尽早检查并主动抛出异常

单独、提前处理边界条件

尽量不使用null表示状态,特别是在集合中

前两条原则通用于大部分UncheckedException,可参考String#toLowerCase()的例子。第三条原则需要在代码的健壮与简洁之间做出权衡,优先保证简洁清晰,需要健壮再去健壮。

CheckedException

猴子对CheckedException的理解不到位,如果各位有更好的理解希望能交流一下。以下讲猴子“不到位”的理解。

CheckedException描述了外部环境导致的不太严重的错误,程序猿应该主动处理。注意与系统级错误区分,系统级错误通常是不可恢复的。因此,CheckedException强制捕获或声明,程序猿必须处理。记录日志,包装后再次抛出,在方法签名中声明,是三种最常见的做法。

同UncheckedException一样,CheckedException也要保证是可控的。对CheckedException的可控性要求更高,不仅要主动检查,还要在捕获到异常时,作出合适的处理。

不过,猴子认为大量CheckedException的存在就是个错误。比如FileAlreadyExistsException,更应该由用户主动检查发现,而不应该依赖于异常。对于可以处理的异常,本质上相当于控制流问题,用异常去表达反而让控制流变模糊。不过有时候猴子写小项目,也会为了简化代码,直接将相关异常声明在方法签名中,并一路声明干到main方法。恩,everything is a trade-off。

IOException

产生IOException的原因非常多,但很多时候我们并不关心细节原因,因为文件系统是一个不太可控的因素,这时我们可以以IOException为粒度处理;某些需要关心细节的异常情况,则应使用IOException的子类,以分情况处理。

前面总结的FileAlreadyExistsException、FileNotFoundException、UnknownHostException等,都是IOException的子类。这三种异常恰好都是可以处理的。

挖坑,InterruptedException也相当重要,后面要专门写一篇来整理。

总结

实际的编码工作中,我们应正确的使用异常表达代码设计,并尽可能使用JDK提供的异常类。JDK内置了非常多的异常类,我们只需要掌握一些常用的异常类,然后举一反三。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 移动页面中的图片上传_移动端上传图片(ajax跨域请求)

第一次写项目开发经验,望担待。除了前端以外的事就不叨叨了,下面开始弄干活(两个页面首页、列表页)。项目开发简述项目需求:上传图片并展示。项目地址:项目的链接地址开发工具:sublime后台:java开发语言&am…

php session 反序列化,PHP SESSION反序列化本地样例分析

PHP SESSION反序列化本地样例分析0X00漏洞原因主要原因是: ini_set(‘session.serialize_handler’, ‘php_serialize’);ini_set(‘session.serialize_handler’, ‘php’);两者处理session的方式不同。0X01漏洞分析如果在PHP在反序列化存储的$_SESSION数据时使用的…

php 标题去重复思想,WordPress网站发布文章时如何防止发布重复标题的文章?

事实上,所有插件后端代码都等同于将代码片段添加到functions.php中,functions.php代码片段可以生成插件,然后插件可以自然地集成到functions.php中。插件主要易于管理,但也增加了静态资源请求的数量。如果您知道如何处理这些请求&…

无法连接iphone软件更新服务器_苹果发布了iphone、ipad和mac的新软件更新

苹果已经发布了三种操作系统的软件更新:用于iphone和ipod的iOS、ipad的iPadOS和Macs的macOS。这些更新很小,主要集中在bug修复上,而不是添加新功能。这些更新标记为iOS 13.6.1、iPadOS 13.6.1和macOS 10.15.6补充更新。通常,iOS或…

win10升级助手_关闭win10系统更新

为什么要拒绝更新系统呢???1.系统更新占用太多时间2.不合时宜的提醒更新严重影响了工作3.对绝大多数人完全没有必要更新系统微软强奸式的要求更新不合清理。同学们的电脑系统大多数是win10家庭版,可以采用下面方案关闭自动更新&am…

matlab 生成信号文件,生成的代码如何存储内部信号、状态和参数数据

浏览模型示例打开模型示例 rtwdemo_roll。open_system(rtwdemo_roll)该模型包含不连接到根级别 Inport 或 Outport 模块的内部信号。某些信号具有名称,例如 phiCmd 信号。该模型还包含一些维护状态数据的模块。例如,在 BasicRollMode 子系统中&#xff0…

苹果平板怎么卸载软件_怎么很好的卸载流氓软件!

我相信在生活当中,很多人都会在不知情或者不注意的情况下,被迫下载很多自己不想要的软件,而且删除之后总是出现,挥之不去。接下来我将会给大家分享几个下载此类软件的方法:一、通过控制面板卸载点击小图标,…

python 循环语句结果存储_python条件语句和循环语句

一、条件语句Python 条件语句跟其他语言基本一致的,都是通过一条或多条语句的执行结果( True 或者 False )来决定执行的代码块。 Python 程序语言指定任何非 0 和非空(null)值为 True,0 或者 null为 False。…

使用c++查看linux服务器某个进程正在使用的内存_精选20个常用的Linux命令

今天总结几个非常常用的Linux命令,其中有几个在面试中很可能问相关命令的原理,比如后台运行命令。希望对大家有所帮助,最好自己去尝试在Linux操作系统中实践一下。1 查看目录以及权限在windows中,使用dir查看当前目录中文件。在Li…

台式电脑可以连wifi吗_不使用WIFI,手机也可以通过电脑的网络上网

让手机通过电脑上网的方式有很多种,最常见的就是 WIFI 了,而且简单直接。但是有时候台式机没有 WIFI ,或者电脑的 WIFI 设备已经连接到其他的网络了,这时候手机就不能通过电脑的 WIFI 连接到网络。那么还没有有办法连接到网络呢&a…

pgsql 前10条_未来3年,广州83条城中村、285个旧街区将迎来改造

文、图/羊城晚报全媒体记者 赵燕华 通讯员 穗建未来3年,广州83条城中村将实施改造,285个旧街区将迎来改造,推进176个旧厂房改造,将整治1.24亿平方米违建……9月25日,在广州市深化城市更新工作推进高质量发展政策培训暨…

c++能干什么_「CG原画插画教程」学画画到底能干什么?

原标题:「CG原画插画教程」学画画到底能干什么?艺学绘小编收集整理了学画画到底能干什么?学画画到底能干什么?相信很多学画画的朋友们都被问过这个问题,那些对学画画有偏见的人,总觉得我们在“不务正业”。…

怎样设置电脑壁纸_怎样设置电脑的资料定时备份到移动硬盘里

怎样设置电脑的资料定时备份到移动硬盘里 写回答...安装FreeFileSync即可,功能有:自动备份、单向备份、双向备份、更新指定文件夹、增量更新、定时备份等。你安装后,添加一个批处理任务来执行将电脑的资料定时备份到移动硬盘。选:…

appium自动化测试_Appium自动化测试入门教程No.1—— Appium介绍

(1)特点appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web应用和混合应用。>>“移动原生应用”是指那些用iOS或者 Android SDK 写的应用(Application简称app)。>>“移动web应用”是指使用移动浏览器访问的应用…

linux 命令行看图片,骚操作:用终端打开图片

导读Linux 上有许多 GUI 图片浏览器。但我尚未听说或使用过任何在终端中显示图片的应用程序。幸运的是,我刚刚发现了一个可用于在终端中显示图像的名叫 FIM 的图像查看器。FIM 引起了我的注意,是因为与大多数 GUI 图片浏览器相比,它非常轻巧。…

linux 登入用户记录,linux记录所有用户登陆及执行过的命令脚本

第一个窗口[roothdss7-4 ~]# echo "historyUSERwhoamiUSER_IPwho -u am i 2>/dev/null| awk {print $NF}|sed -e s/[()]//gif [ "$USER_IP" "" ]; thenUSER_IPhostname ## 获取ip 并且存到变量中fiif [ ! -d /var/log/history ]; thenmkdir /var/…

线程被中断跟被阻塞有什么区别_宠物加盟店跟自营店有什么区别

宠物加盟店跟自营店有什么区别开宠物店是一个很有发展、很有市场前景的项目,特别是在这几年,已经迅猛发展。如果想加入宠物行业,利润、赚钱、前景都不用担心,只要有愿意做成的心,市场大环境不用担心。关于大家提出的宠…

不超过20位的小数正则_意甲身价最贵的20位球星,国米多达7人超过尤文,夺冠成硬任务...

根据《德转网》的最新统计,在本赛季意甲身价排名前20位的球星当中,国际米兰俱乐部拥有多达7人,比起意甲霸主尤文图斯还要多出2人。这7位国米球星分别是卢卡库(意甲球员身价第一,8000万欧元)、马丁内斯(意甲球员身价第四、4000万欧…

mcp证书有什么用_建造师的行情怎么样呢?建造师证书有什么用?

近年来,一二级建造师报名人数的逐年递增。从2004年至今,从当初几万人报考到现在的几百万人报考,这些都说明了大家都意识到了建造师证书的重要性。因为要用到证书的地方太多了,建筑企业升级资质要求建造师证书、企业年检要求建造师…

linux环境变量命名规范,Linux就该这么学 -- 重要的环境变量

变量是计算机系统用于保存可变值的数据类型。在Linux中,变量名一般都是大写,这是一种约定俗成的规范,我们可以直接通过变量名称来提取到对应的变量值。用户执行一条命令,Linux系统一般分为4个步骤第一步:判断用户是否以…