异常

异常

本章目标

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的作用

    • 是异常处理中的一个概念,表示无论是否出现异常,finally的内容都会被执行。
  • finalize的作用

    • 它是Object类中的一个方法,是java的Gc(垃圾回收器)自动会调用的一个方法。
     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项目中如何去引用他们编写的这些工具呢?

步骤:

  1. 下载相应的工具包(sdk):他们一般帮助我们将其打成了jar包(压缩包 字节码文件的集合)
  2. 将jar包引入到项目的类库中(像引入jre一样)
  3. 引入之后根据工具的说明书(API文档)进行使用即可

我们记录日志可以采用的工具包:log4j、log4j2、logback…(slfj日志门面)

  • 在java项目中创建一个文件夹(lib)存放jar包

  • 将jar包引入类库

  • 根据要求和使用进行说明进行使用

    • 准备一个日志配置文件log4j.properties配置日志运行的规则

    • 使用API来进行日志记录

      • Logger类

        Logger getLogger(字节码对象);

        • info() 记录普通信息
        • debug() 记录方便我们调试的信息
        • error() 记录错误信息

你可能感兴趣的:(异常)