一、为什么要引入异常?
可以识别代码的错误响应机制,使代码更加的健壮,提高用户的体验。
二、异常体系
三、异常的分类
1.编译时异常(受检异常):
除RuntimeException之外的异常在编写代码时就出现错误。
2.运行时异常(非受检异常):
RuntimeException及其子类异常只有在代码在运行才会报错。
四、处理异常的三种方式
1.throws声明异常
用在方法上,目的是为了告诉调用者调用该方法有可能会发生什么异常
Step1.在方法上声明异常,如果是运行时异常可以省略
Step2.要求方法调用者自己处理异常
Step3.如果方法调用者没有处理,那么继续交给虚拟机处理
2.throw抛出异常
手动创建异常对象并抛出使用抛出异常的原则
应该抛出足够明确的异常,让使用者能够见名知意
throw new 异常();
throws与throw对比
1、throw 在方法体内使用,throws 在方法声明上使用;
2.throw 后面接的是异常对象,只能接一个。throws 后面接的是异常类型,可以接多个,用逗号隔开;
3.try...catch捕获异常
好处
可以根据捕获不同的异常进行分别处理
特点
只有在try中发生异常,才会进入catch
一旦进入catch,try中没有执行的代码也不会被执行
使用方式
1.吞没异常,什么都不处理,可以使程序继续运行
2.只打印异常信息,程序仍可继续运行
3.配合throw 或者return关键字,处理异常,并使程序退出
4.捕获多个异常按不同需求处理,但是多个异常有父子关系,父异常必须在子异常后面
五.异常父类throwable的成员方法
getMessage:显示异常消息
toString:显示异常类型+异常消息
printStackTrace:在控制台上打印完整的异常栈,包括异常行数+异常类型+异常消息(最常用,便于分析异常)
6.自定义异常
Java提供了一些异常,但是Java官方无法为这个世界上的全部问题都提供异常类,自己的某种问题,想通过异常来表示,那就需要自己来定义异常类了。
步骤
Step1:定义异常类,类名必须见名知意
Step2:写继承关系(可以继承Exception,但大多都继承RuntimeException)
Step3:生成构造器,一般空参有参都生成
Step4:按照手动处理异常的方法,声明、抛出或者捕获你所自定义的异常即可