BCSP-玄子JAVA开发之面向对象编程CH06_ 异常笔记
6.1 什么是异常
是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序
6.1.2 程序中的异常处理
Java编程语言使用异常处理机制为程序提供了错误处理的能力
Java中,所有的异常都定义为类,除了内置的异常类之外,Java也可以自定义异常类,Java的异常处理机制也允许自行抛出异常
6.1.4 Java 中如何进行异常处理
Java的异常处理是通过5个关键字实现的
- try:执行可能产生异常的代码
- catch:捕获异常
- finally:无论是否发生异常,代码总能执行
- throw:手动抛出异常
- throws:声明方法可能要,抛出的各种异常
6.1.5 常用的异常处理结构
try {
//有可能出现异常的语句
}[catch(异常类型 异常对象) {
//异常处理语句
}] [finally {
//一定会运行到的语句
}]
catch 和 finally 可选,但不能同时省略
6.1.6 try-catch-finally
在 try-catch 块后加入 finally 块,不论是否发生异常都执行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o2M2BLZA-1676141428288)(./assets/image-20230212022102788.png)]
6.1.7 多重 catch 块
try {
//有可能出现异常的语句
}[catch(异常类型1 异常对象) {
//异常处理语句
}catch(异常类型2 异常对象) {
//异常处理语句
}……]
[finally {
//一定会运行到的语句
}]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rc8OyMpO-1676141428291)(./assets/image-20230212022638271.png)]
引发多种类型的异常
-
排列catch 语句的顺序:先子类后父类
-
发生异常时按顺序逐个匹配
-
只执行第一个与异常类型匹配的catch语句
6.1.8 多重异常处理示例
从上到下的顺序检测每个catch语句。当匹配到某条catch语句后,后续其他catch语句块将不再执行
Exception为参数的catch语句必须放在最后的位置;否则,后面以其子类异常作为参数的catch语句将得不到被执行的机会
6.2 异常的分类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ibcn8gs4-1676141428291)(./assets/image-20230212022813823.png)]
6.2.1 运行时异常
是可以在程序中避免的异常,当程序进行时发生异常,会输出异常堆栈信息并终止程序运行,可以使用try-catch语句捕获
6.2.2 常见的异常类型
异常类型 | 说明 |
---|---|
ArithmeticException | 当出现算术错误时,抛出此异常 如:一个整数“除以零”时,抛出此异常 |
ArrayIndexOutOfBoundsException | 非法索引访问数组时抛出的异常 如索引为负或大于等于数组长度 |
ClassCastException | 当试图将对象强制转换为非本对象类型的子类时,抛出该异常 |
IllegalArgumentException | 表明向方法传递了一个不合法或不正确的参数 |
InputMismatchException | 欲得到的数据类型与实际输入的类型不匹配 |
NullPointerException | 当应用程序试图在需要对象的地方使用null时,抛出该异常 |
NumberFormatException | 当试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常 如:把“ABC”转成数字 |
6.2.3 Checked异常
-
是指运行时异常以外的异常
-
是用户错误或问题引起的异常
-
程序员无法预见
-
编译器会提示
-
如果不进行捕获,则会出现编译错误
-
常见的异常类型
-
FileNotFoundException异常
-
SQLException异常
-
对异常类子类命名时会使用XXXError
或XXXException形式
6.2.4 异常处理的完整流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GMUVPDlZ-1676141428292)(./assets/image-20230212023313284.png)]
-
对于异常处理,不同项目的要求并不相同
-
由项目开发标准决定异常是统一使用Exception类型接收处理还是分开处理
-
如果开发要求严格,会对每一种异常分别进行处理,详细记录异常信息,产生一定工作量
6.3 声明异常
使用关键字throws声明某个方法可能抛出的各种异常
public void 方法名() throws 异常类型[,异常类型] {
//方法体 声明异常,多个异常用逗号隔开
}
实际开发中,main()方法不建议声明异常,因为如果程序出现了错误,会导致程序中断执行
6.4 抛出异常
-
除了系统自动抛出异常外,有些问题需要程序员自行抛出异常
-
根据程序逻辑自定义的异常类,在Java异常体系中并未提供,不能抛出
-
根据业务需要自行选择异常抛出时机,或自定义异常处理逻辑
throw new 异常名([参数列表]);
throw抛出的只能是Throwable类或其子类的对象
6.5 自定义异常
当Java异常体系中提供的异常类型不能满足程序的需要时,可以自定义异常类
步骤
-
定义异常类,继承Exception类或者RuntimeException类
-
编写异常类的构造方法,并继承父类的实现
-
实例化自定义异常对象,并使用throw关键字抛出
6.5.1 自定义异常的应用场景
-
项目中因业务逻辑错误需要抛出异常,但Java中不存在这类异常例如,年龄异常、性别异常等
-
项目开发一般是由团队成员共同完成,为统一对外异常展示的方式,可以使用自定义异常
6.6 日志记录框架
使用日志框架以文件形式记录异常信息
日志(log)
-
主要用来记录系统运行中一些重要操作信息
-
便于监视系统运行情况,帮助用户提前发现和避开可能出现的问题,或者出现问题后根据日志找到原因
日志分类
- SQL日志、异常日志、业务日志
日志的主要用途
-
问题追踪
-
状态监控
-
安全审计
6.6.1 日志框架log4j2
一款非常优秀的日志框架
-
控制日志的输出级别
-
控制日志信息输送的目的地是控制台、文件等
-
控制每一条日志的输出格式
6.6.2 使用log4j2记录日志
操作步骤
-
编写配置文件
- 文件后缀可为.xml、.json或者.jsn
-
定义日志记录器Logger
- 获取日志记录器的方式
-
记录日志
- Logger类可以替代System.out或者System.err,供开发者记录日志信息
6.6.3 Logger类常用方法
方法 | 描述 |
---|---|
publicvoiddebug(Objectmsg) publicvoiddebug(Objectmsg,Throwablet) | 记录debug级别日志 |
publicvoidinfo(Objectmsg) publicvoidinfo(Objectmsg,Throwablet) | 记录info级别日志 |
publicvoidwarn(Objectmsg) publicvoidwarn(Objectmsg,Throwablet) | 记录warn级别日志 |
publicvoiderror(Objectmsg) publicvoiderror(Objectmsg,Throwablet) | 记录error级别日志 |
publicvoidfatal(Objectmsg) publicvoidfatal(Objectmsg,Throwablet) | 记录fatal级别日志 |
需要手工创建
一般用log4j2.xml命名
6.6.4 日志记录器的日志级别
-
all:最低等级,用于打开所有日志记录
-
trace:用于程序追踪输出
-
debug:指出细粒度信息事件,对高度应用程序是非常有帮助的
-
info:在粗粒度级别上指明消息,强调应用程序的运行过程
-
warn:表示警告信息,即可能会出现的潜在错误
-
error:指出虽然发生错误事件,但仍然不影响系统的继续运行
-
fatal:指出将会严重的错误事件将会导致应用程序退出
-
OFF:最高等级的,用于关闭所有日志记录
程序会输出高于或等于所设置级别的日志
设置的日志等级越高,输出的日志就越少
BCSP-玄子JAVA开发之面向对象编程CH06_ 异常笔记