异常处理相关知识点系统整理
文章目录
- 异常处理相关知识点系统整理
- 一、异常的基本概念与体系结构
- 1. 异常的顶层结构
- 2. 异常的分类
- 二、异常的处理机制
- 1. try-catch-finally 结构
- 2. 异常的抛出与声明
- 3. 异常处理的匹配规则
- 四、异常与继承的关系(子类与父类的异常规则)
- 五、其他相关知识点
- 六、异常处理的最佳实践
异常处理相关知识点系统整理
一、异常的基本概念与体系结构
1. 异常的顶层结构
- 所有异常类的顶层父类是
Object类 - 异常体系的核心类是
Exception,它是所有异常的直接或间接子类
2. 异常的分类
| 类型 | 特点 | 典型示例 |
|---|---|---|
| 运行时异常(非必检异常) | 继承自RuntimeException类 ,编译器不强制处理,可选择性捕获或抛出 | NullPointerException(调用空对象的方法或访问空对象的属性)、ArrayIndexOutOfBoundsException(访问数组越界)、ArithmeticException (算术运算错误) |
| 非运行时异常(必检异常) | 继承自Exception类,编译器强制要求处理(要么捕获,要么声明抛出) | IOException(输入输出异常)、SQLException(数据库操作失败)、ClassNotFoundException(动态加载类时找不到类) |
| Error | 继承自Error类、系统级严重问题,通常无法恢复 | OutOfmemoryError(内存不足)、StackOverflowError(栈溢出)、NoClassDefFoundError(编译时存在类,但运行时找不到类定义 |
二、异常的处理机制
1. try-catch-finally 结构
- try块:用于包裹可能发生异常的代码,代码应精简
- catch块:
- 一个try可以搭配多个catch语句,处理不同类型的异常
- 匹配规则:应从子类到父类的顺序编写(从下往上匹配),否则子类异常会被父类异常捕获,导致子类异常处理块失效
- finally块:
- 无论是否发生异常,都会执行
- 典型用途:释放IO资源等需要最终清理的操作
- 注意事项:
- 若finally中有return语句,会覆盖try或catch中的return结果
2. 异常的抛出与声明
- 抛出异常(throw):在方法内部使用
throw关键字手动抛出异常对象,如throw new Exception("错误信息"); - 声明异常(throws):
- 在方法声明处使用
throws关键字声明可能抛出的异常,属于"消极处理异常" - 原则:能处理的异常尽量处理,不轻易声明抛出
- 示例:
public void method() throws IOException, SQLException { ... }
- 在方法声明处使用
3. 异常处理的匹配规则
- 当异常发生时,系统会生成异常对象并沿方法调用堆栈向上传递(“如果没有找到,会向上找错”)
- 异常匹配从最具体的子类异常开始,逐步匹配父类异常
四、异常与继承的关系(子类与父类的异常规则)
- 子类重写父类方法时,抛出的异常需满足:
- 可以抛出比父类异常类更低级的异常(子类异常)
- 可以不抛出任何异常
- 不可以抛出与父类异常无关的异常
- 可以抛出多个异常,但需符合上述规则
- 若父类抛出非运行时异常,子类重写时需遵循上述规则
- 运行时异常在继承关系中无严格限制,可自由处理
五、其他相关知识点
- instanceof 运算符:用于判断一个对象是否为某个异常类(或其子类)的实例,可辅助异常类型判断,如
if (e instanceof NullPointerException) { ... } - 自定义异常类:
- 一般继承
Exception类(若为必检异常)或RuntimeException类(若为运行时异常) - 通常需要定义构造方法,以便传递异常信息
- 一般继承
六、异常处理的最佳实践
- 优先处理异常而非声明抛出(“能不申明的尽量不去申明,尽量去处理”)
- 避免在finally中使用return语句,防止覆盖正常返回结果
- 捕获异常时遵循从具体到抽象的顺序(子类到父类)
- 对于IO等资源操作,务必在finally中释放资源,确保资源回收