Java14 异常知识点
一、概念【理解即可】
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. 子类不能抛出比父类更多、更宽泛的异常(可以抛出更少、更窄的异常,或不抛出异常)。
