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,一经查实,立即删除!

相关文章

mysql 读取properties_JDBC中使用Properties读取配置文件有什么用

开发中获得连接的4个参数(驱动、URL、用户名、密码)通常都存在配置文件中,方便后期维护,程序如果需要更换数据库,只需要修改配置文件即可。使用properties文件,Java中有专门用来装载配置文件的类Properties(Java.util.Properties)…

java preferences设置_Java利用Preferences设置个人偏好

Preferences的中文意思即偏好或喜好的意思,也就是说同一个程序在每次运行完后,可以通过Preferences来记录用户的偏好,下次启动时,程序会利用这些信息来了解用户的喜好。而这些信息个人理解应该就是存储在系统的注册表中。下面我们…

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

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

java 空包_圆通快递接口,圆通快递礼品商城接口、圆通空包接口,圆通快递低价接口,礼品商城接口、一件代发接口...

更新仓库列表接口地址:http://xxxxxx.com/shop/updates/update-warehouse-list 违心:juzivtu接口介绍:更新发货仓库及发货快递信息请求方式:POST传参方式:JSON返回格式:JSON接口收费:开通一次,…

c和java内存泄漏区别_内存溢出和内存泄漏的区别(转)

1.1内存溢出:(Out Of Memory---OOM)系统已经不能再分配出你所需要的空间,比如你需要100M的空间,系统只剩90M了,这就叫内存溢出例子:一个盘子用尽各种方法只能装4个果子,你装了5个,结果掉倒地上不…

php正则表达式匹配逗号,数字和逗号PHP正则表达式只

我需要创建一个正则表达式验证逗号分隔的数值。数字和逗号PHP正则表达式只他们应该是这样的:1,2,3,4,5等....的值必须是一个数字,如:1点之前或之后没有空的空间,没有逗号之前或之后。或者......多个数值以逗号分隔。第一个和最后一…

java想要生成 字符串,如何在Java中“优雅地”生成String?

我想生成一个字符串,如sql命令:"INSERT INTO xxx VALUES(XXX, XXX, XXX)"目前我使用StringBuilder和一些String常量,如“INSERT INTO”来连接表名和插入值的输入String参数.但是,除了性能问题之外,这种简单的连接看起来并不优雅.有没有其他方法这样做&…

java语言中json转换,JSON字符串和JAVA语言对象的相互转换教程

本文主要向大家介绍了JSON字符串和JAVA语言对象的相互转换教程,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。一:字符串转换为对象:使用JSON.parse()方法var str { "name": "AndrewNeo", "sex"…

php中的数组用什么统计,php数组元素统计与值汇总

array_count_values()array_count_values() 函数用于统计数组中所有值出现的次数。本函数返回一个数组&#xff0c;其元素的键名是原数组的值&#xff0c;键值是该值在原数组中出现的次数。语法 : array_count_values(array)参数描述array必需。规定输入的数组。例子<?php …

10天时间做出php,php 最近10天的所有日期

背景&#xff1a;有时候&#xff0c;比如画曲线图&#xff0c;需要前一天起近10天的日期&#xff0c;你不能获取昨天的时间一天一天减&#xff0c;可别减出20140230&#xff0c;20140231&#xff0c;这就闹笑话了我用下面的笨方法。$date array();for($i10;$i>1;$i--){$dat…

php cgi漏洞,Nginx + PHP CGI的一个可能的安全漏洞

现在普遍的Nginx PHP cgi的做法是在配置文件中, 通过正则匹配Nginx(PHP/fastcgi的PATH_INFO问题,设置SCRIPT_FILENAME, 今天发现了一个这种方式的安全漏洞.为什么会这样呢?比如, 如下的nginx conf:location ~ .php($|/) {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.p…

java开发怎么优化代码,代码优化,该如何处理

当前位置:我的异常网 Java Web开发 代码优化,该如何处理代码优化,该如何处理www.myexceptions.net 网友分享于&#xff1a;2014-08-19 浏览&#xff1a;0次代码优化public String Txt() throws ParseException {re (HttpServletRequest) ActionContext.getContext().get(S…

kali2.0安装mysql,Ubuntu/kali上安装MySQL,设置远程访问详细教程

搜索热词Ubuntu上安装MysqL非常简单只需要几条命令就可以完成。1. sudo apt-get install MysqL-server2. apt-get installMysqL-client (可选)3. sudo apt-get install libMysqLclient-dev(可选)安装过程中会提示设置密码什么的&#xff0c;注意设置了不要忘了&#xff0c;安装…

php数组在golang,go语言数据类型-数组(array)

数组是Go语言编程中最常用的数据结构之一。顾名思义&#xff0c;数组就是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素(element)&#xff0c;一个数组包含的元素个数被称为数组的长度。在Go语言中数组是一个值类型(value type)。是真真实实的数组&#xff…

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

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

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

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

php前端介绍,Web前端的开发前景介绍

“路漫漫其修远兮&#xff0c;吾将上下而求索”&#xff0c;这句出自《离骚》。虽然端午已过&#xff0c;但是还是不影响一个程序员想表(zhuang)达(boy)自己此刻心情的冲动。偶然路过同事旁边&#xff0c;不(tou)小(kan)心看到他加的一个群&#xff0c;在问&#xff0c;web前端…

hive mysql命令,Hive数据库常用命令

收藏一些Hive数据库常用命令&#xff0c;方便平时准备测试数据集。查看库、创建普通Hive表&#xff1a;show databases;user lch_databases;show tables;create table lch_user_table(int id,name varchar(8),birthday date,salary double(24.7),dd1 decimal(18,4));alert tabl…

判断星座PHP,php根据日期判断星座的函数分享_PHP教程

复制代码 代码如下:function yige_constellation($month, $day) {// 检查参数有效性if ($month < 1 || $month > 12 || $day < 1 || $day > 31) return false;// 星座名称以及开始日期$constellations array(array( "20" > "宝瓶座"),arra…

lumen php命令,php – 如何使用命令行手动运行laravel / lumen作业

跑php artisan make:command DispatchJob创建运行工作的特殊工匠命令.打开创建的DispatchJob.php文件并定义DispatchJob类,如下所示&#xff1a;class DispatchJob extends Command{/*** The name and signature of the console command.** var string*/protected $signature …