异常
本章目标
1、了解异常概念
2、理解java异常处理机制
3、会捕捉异常
4、会抛出异常
5、了解java异常体系结构
6、会编写自定义异常
7、会使用日志记录异常情况(log4j、log4j2、logback)
前面所遇到的异常:
ArrayindexOutOfBoundsException数组下标越界异常
NullPointerException(NPE)空指针异常 当引用数据类型没有引用某个内存空间时 它的值就是null,那么如
果null值去使用方法、属性则会报出异常
ClassCastException类型转换异常 多态时尤其可能出现,不确定多态的具体类型时 转换可能出现的问题。
ClassNotFoundException类找不到异常
ArithmeticException算数异常 除数为0
inputMismatchException输入不匹配异常
一、了解异常概念
1、生活中的异常
异常:在执行某件事的过程中,出现了不符合预期的情况
电梯异常、地铁异常、电路异常…
1.2、程序中的异常
在程序运行中出现的问题,会导致程序中断(结束),后续代码不会再执行
二、理解java异常处理机制
java提供了一套异常处理机制来解决我们使用过多的if判断问题(补不全、代码维护性变差、阅读困难)。
由下方的这些关键词可以让我们的程序遇到异常时候更加健壮。
try:尝试
catch:抓狂
finally:最终的
throw:扔
throws扔
三、会捕捉异常
1、try-catch组合
//在try代码块中执行有可能出现异常的代码段
//当出现了异常的情况,catch(异常类型)标注的异常会捕获合适的异常。(例如缉毒警察不会管理交通事故)
//捕获到合适的异常之后,可以对异常采取修复/处理手段
//代码可以继续正常的执行下去
try{
//可能会出现异常的代码
}catch(){
//对异常的修复/处理
}
3.2多重catch块
//类似于多重if一样,出现的异常会挨个进行尝试调用catch 只要有一个匹配 则执行处理 后面的catch不会处理了
//小心异常类型范围大的记得放在后面
try{
//可能出现的问题代码
}catch(异常类型1){
// 对应的处理代码
}catch(异常类型2){
//对应处理代码
}......
catch(Exception e){//Exception是异常的顶级父类 它可以接收任何异常类型的对象(多态)
//最终默认的处理代码
}
catch代码块中是用于处理异常情况,一般情况下由下方几种手段:
1、以友好的形式,提示异常信息sout
2、使用异常的堆栈跟踪来打印异常信息(这个和jvm处理不一样,jvm会中断程序)
3、使用日志来记录异常 信息。
4、根据逻辑进行合理值更改
3.3try-catch-finally/try-finally
try{
//可能出现异常的代码段
}catch(异常类型 e){
//处理异常代码段
}finally{
//最终执行的代码段:无论是否出现异常 此处代码段都会执行
//一般的盈盈在资源释放上
}
try{
//可能出现的代码
}finally{
//最终执行的代码:资源释放....
}
面试题1:如果finally和return同时出现,那么如何执行?
会先执行finally中的内容,然后在执行return。
面试题2:final、finally、finalize的区别?
final的作用
finally的作用
finalize的作用
protected void finalize() throws Throwable{}
四、会抛出异常
面试题:throw和throws的区别?
throw表示抛出异常 抛出异常后面 要跟随 异常的对象 用于告知调用者异常的信息(异常对象)后期常用来抛出自定义异常。
thows表示声明异常 他是在方法声明上进行指定的, 一般表示次方法不处理异常而是向上甩锅
五、了解java异常体系结构
Throwable 顶级接口
//异常指的是可以经过处理而修复的问题 Error是必须通过更改代码才能修复的问题
Exception异常的顶级父类 Error错误的顶级父类
//表示代码编写出来后必须要求提前处理的异常 表示代码编写后非必须要处理的异常
//例如:FileNotFoundException 例如InputMismatchExceptionNumberFormatException
Checked异常(受检异常) UnChecked异常(不受检异常)
六、会编写自定义异常
如果觉得java的异常体系不够丰富可以自行创建异常类
//public class IllegalAgeException extends Exception{
public class IllegalAgeException extends RuntimeException{
public IllegalAgeException() {
super();
}
public IllegalAgeException(String message) {
super(message);
}
}
public void setAge(int age) throws Exception {
if(age < 0 || age > 100) {
// System.out.println("对不起!年龄非法!");
// throw new Exception("年龄非法!");
throw new IllegalAgeException("年龄非法!");
}else {
this.age = age;
}
}
七、会使用日志记录异常情况(log4j、log4j2、logback)
logforjava
Int2String
try{
}catch(Exception e){
//处理
}
它用来记录系统运行中的一些重要操作信息,便于监视系统运行情况,也便于出现问题后快速找到原因的文件。
.log
我们要记录日志,如果自己来实现这种功能非常繁琐,所以有很多组织或个人开发了相关的工具来源出来供我们使用,那么在我们的java项目中如何去引用他们编写的这些工具呢?
步骤:
jar
包(压缩包 字节码文件的集合)我们记录日志可以采用的工具包:log4j、log4j2、logback…(slfj日志门面)
在java项目中创建一个文件夹(lib)存放jar包
将jar包引入类库
根据要求和使用进行说明进行使用
准备一个日志配置文件log4j.properties
配置日志运行的规则
使用API来进行日志记录
Logger类
Logger getLogger(字节码对象);