Java语言:异常总结

目录

异常的概述

异常分类

异常处理的分类

Try-catch-finally

使用try-catch结构处理异常

使用多重catch结构处理异常

终止finally执行的方法

return关键字在异常处理中的作用

使用throws声明异常类型

使用throw抛出异常对象

自定义异常

异常链简介


异常的概述

异常本质上是程序上的错误,或者是背离程序本身的意图,都可以理解为异常

  • 异常分类

对于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方法可以对异常信息进行打印

异常链简介

异常链就是逐层的抛出形成的链条

下面用一个例子来说明异常链是什么

通过上图中的结果可以看出,异常信息的丢失(下面是应对异常信息要涉及的两个方法)

或者就是像下面这样写,像这样写新的异常就不会被覆盖

正常的运行结果如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值