目录
异常的概述
异常本质上是程序上的错误,或者是背离程序本身的意图,都可以理解为异常
-
异常分类
对于Error,一般都是JVM出现了问题,且这些问题都是无法通过程序进行解决的
Exception异常类的子类分为检查异常和非检查异常,检查异常必须要在程序中进行处理,无论异常是否发生,但是非检查异常不一定在程序中进行处理,只有发生的时候才要处理,如果没有发生异常,就可以不写异常处理语句(个人感觉这里表达的不是很好,那就举个例子吧!)
假设有一个房间,检查异常进去的时候就必须要过安检,但是非检查异常过去不一定要过安检,只有在非检查异常做出什么不好的事情的时候安保才会出动,如果它安分守己,那么非检查异常就能平安无事
在Java中除了runtimeException及其子类,其他的异常都属于检查异常
-
异常处理的分类
异常的处理过程:当有程序发生异常的时候,会创建一个异常对象,抛出异常给运行时系统,运行时系统接收异常,寻找合适的处理器,如果找到了相应的处理器,就会进行相应的处理,如果没有找到,程序就会终止执行
异常常见的几种处理方式如下所示
Try-catch-finally
try-catch-finally基本的结构如下
try块的作用是捕获异常
catch块的作用是处理异常
finally块的作用是无论如何都会执行的语句
-
使用try-catch结构处理异常
举例如下
异常对象自带了一个方法就是printStackTrace方法,使用这个方法,就能知道是哪里出现了异常和出现了什么异常,会对异常出现的地方进行输出(如下图)
下面就对异常进行了输出,告诉你错误的地方在哪里,看异常一般从最下面一行开始看,会看到一个大概的位置
还有一点就是使用printStackTrace进行堆栈的输出的时候,信息的输出的位置是随机的,没有什么固定的位置,所以会看到下图中的运算结束输出在异常语句的中间
-
使用多重catch结构处理异常
在一个try块下面,使用多个catch块语句的时候,不能让异常的类型相同,否则编译会报错
在使用多个catch语句块的时候,因为不能够保证每一个异常都被包含,那么就要在最后写一个catch语句块,当中写上Exception,因为这个是父类,所以无论来什么异常,都会被捕获
还有一点就是父类异常作为catch块中的语句,一定不能够放在在前面,一定要放在catch块的最后,否则会出错,如下图
-
终止finally执行的方法
终止finally执行的方法就是下图中的红色圈住的语句
exit后面的括号中的数字只要是非0就可以了。在异常中,表示异常终止
-
return关键字在异常处理中的作用
在这里最终都会执行finally中的语句,如果把finally语句块中的return语句不写,那么之前在try块中,或者是catch块中写的return语句才会有用
使用throws声明异常类型
然后谁接收了这个异常,谁就来处理这个异常,换句话来说,谁调用这个方法,谁就来处理这个异常
下面的例子将告诉你如何让调用该方法的方法处理,而自己不处理
添加try-catch块小Tip:选中要添加try-catch的语句块就可以了,然后右键找到下面图片中的菜单下拉列表即可
当出现多异常的时候
//方案一
就要在throws后面写上会出现的异常,使用逗号隔开,如下图所示
//方案二
在这里可以直接写抛出Exception(异常父类),在这里要注意的问题就是对于调用此方法的调用者,一定要对Exception异常进行处理,否则会出错,不能只处理Exception子类
对于使用throws抛出异常之后,对于抛出非检查异常,并不是一定要写处理语句,如果不写的话,编译也是通过的,如果抛出的检查异常,那么一定要进行异常的处理
使用throw抛出异常对象
使用throw关键字处理异常有下面两种方法,第一种就是自己抛出的异常对象自己处理,第二种就是使用throws进行异常的抛出,抛出相应的异常类型,这样就好了,谁调用了这个方法,谁就进行异常的处理
在这里可能会好奇为什么要主动的去抛出异常,我们应该尽可能的去避免异常,这里就像一个段子一样,程序员去写bug,但是其实这是有一点的道理的,理由如下图
举例如下(这里为了实现入住酒店的规定和要求,就可以通过抛出异常的方式进行解决,当然你也可以通过逻辑设计实现,这里只是举一个例子)
Exception类有一个带字符串的构造方法,可以使用这个方法描述异常信息
下面就是完成了酒店入住的业务逻辑
throws总结如下
自定义异常
自定义异常的举例如下
自定义异常抛出
下图中的getMessage方法可以对异常信息进行打印
异常链简介
异常链就是逐层的抛出形成的链条
下面用一个例子来说明异常链是什么
通过上图中的结果可以看出,异常信息的丢失(下面是应对异常信息要涉及的两个方法)
或者就是像下面这样写,像这样写新的异常就不会被覆盖
正常的运行结果如下