一、概念【理解即可】

1. 异常:程序运行过程中,出现的非正常情况。

2. 异常的处理:当异常出现时,执行一段预先准备好的代码。

3. 异常处理的必要性:减少用户的损失、同时减小给用户带来麻烦,也可以对用户做一些提示信息。
二、异常的分类【面试重点】

1. Throwable:Java语言中所有错误或是异常的父类,位于java.lang包中

◦ 核心方法:
方法声明 功能说明 
String getMessage() 获取字符串类型异常信息,用于给用户展示提示信息 
void printStackTrace() 打印输出方法调用过程中产生的详细异常信息,供程序员调试程序 

2. 子类Error:代表错误

◦ 说明:仅靠程序本身无法恢复的严重错误,例如JVM内存不足、方法调用栈溢出等。

◦ 示例:java.lang.StackOverflowError(递归导致的栈溢出)

3. 子类Exception:代表异常

◦ RuntimeException(运行时异常/未检查异常):与RuntimeException有直接或间接继承关系的异常类

◦ 特点:编译器不会检测此类异常,运行时才报错。

◦ 处理:可处理,可不处理(严谨代码建议处理),此类异常可以避免。

◦ 常见示例:

1. java.lang.ArrayIndexOutOfBoundsException:下标越界

2. java.lang.NullPointerException:空指针异常

3. java.lang.ClassCastException:类型转换异常

4. java.lang.NumberFormatException:数字格式转换异常

◦ 非RuntimeException(非运行时异常/已检查异常):与RuntimeException无任何继承关系的异常类

◦ 特点:编译器检测此类异常,编译时报错。

◦ 处理:此类异常必须处理。

◦ 示例:Class.forName("day1.TestStudent");
三、异常的产生

1. 自动产生异常

◦ 产生原因:程序运行过程中遇到错误代码,自动产生异常。

◦ 结果:程序一旦遇到异常,会被终止,无法继续执行异常之后的代码。

2. 手动产生异常【开发重点】

◦ 关键字:throw

◦ 语法:throw new 异常类类名("异常信息");

◦ 位置:必须定义在方法内部

◦ 结果:相当于return,终止当前程序,程序会因异常而被终止。
四、异常的传递【理解即可】

• Java中的异常沿着方法的调用链进行反方向传递,最终传递给JVM,导致程序被终止。
五、异常的处理【开发重点】

1. 消极处理异常(声明异常)

• 关键字:throws

• 位置:在方法声明的位置进行消极处理

• 语法:修饰符 返回值类型 方法名(形参列表) throws 异常类名1,异常类名2,异常类名3{}

• 结果:仅推卸责任,程序仍会因异常而被终止。

• 作用:让非运行时异常在编译阶段通过。

• 注意:消极处理异常时,可以利用父类类型处理其子类型的异常。

2. 积极处理异常(捕获异常)

• 语法:
try{
    // 可能出现异常的语句
}catch(异常类名 e){
    // 异常出现时需要执行的语句
}
• 注意事项:

1. try后面可以定义多个catch结构,一旦try出现异常,会从上往下依次匹配第一个符合的catch。

2. catch可以利用父类类型处理本类型+所有子类型的异常(多态的应用)。

3. 定义子类的catch需要写在其父类类型的catch结构前面。

4. catch中只能捕获try可能出现的非运行时异常;但catch中可以处理任意运行时异常,不管try中是否有可能出现此类异常。

3. finally的应用

• 语法:
try{
    // 可能出现异常的语句
}catch(异常类名 e){
    // 异常出现时执行的语句
}finally{
    // 不管有没有异常,都必须执行的语句
}
• 应用场景:开发中不建议将return语句定义在finally中,通常finally用于关闭资源(如文件流、数据库连接)。

• 常见结构:

◦ try{}catch(){}

◦ try{}catch(){}catch(){}

◦ try{}catch(){}finally{}

◦ try{}catch(){}catch(){}finally{}

◦ try{}finally{}(仅为了执行必须语句)

• 注意:try后面可以跟多个catch,但最多只能有一个finally;try后面至少有一个catch或是finally。
六、自定义异常

1. 定义规则:

◦ 类继承Exception或是其子类 → 抛出的异常为非运行时异常

◦ 类继承RuntimeException或是其子类 → 抛出的异常为运行时异常

2. 必须提供的构造方法:

◦ 无参构造方法

◦ 带String类型参数的构造方法(借助super()为父类Throwable的异常信息属性赋值)
public class 类名 extends Exception/RuntimeException{
    public 类名(){}
    public 类名(String message){
        super(message);
    }
}
七、方法覆盖(异常相关)【面试+开发重点】

方法重写的异常相关规则:

1. 子类的方法名、形参列表、返回值类型和父类相同。

2. 子类的方法的访问修饰符和父类相同或是更宽松(如父类protected,子类可以是protected或public)。

3. 子类不能抛出比父类更多、更宽泛的异常(可以抛出更少、更窄的异常,或不抛出异常)。

更多推荐