关于JAVA异常的笔记

一、异常的定义

异常是程序运行过程中出现的非正常情况(如除零、数组越界、文件不存在等),会中断程序的正常执行流程。Java 通过面向对象的方式对异常进行封装和处理,提高程序的健壮性。

二、异常的体系结构

Java 异常的根类是 java.lang.Throwable ,其下分为两大子类:

  1. Error(错误)

​- 由 JVM 抛出,属于严重系统级问题,程序无法处理和恢复。

​- 常见示例: StackOverflowError (栈溢出)、 OutOfMemoryError (内存溢出)。

​2. Exception(异常)

​- 程序运行时的非正常情况,可通过代码捕获和处理。

​- 分为两类:

​- 编译时异常(受检异常 Checked Exception):编译阶段必须处理,否则代码报错。如 IOException 、 SQLException 、 ClassNotFoundException 。

​- 运行时异常(非受检异常 Unchecked Exception):编译阶段无需强制处理,运行时才会抛出。如 NullPointerException 、 ArrayIndexOutOfBoundsException 、 ArithmeticException 。

三、异常的处理机制

Java 提供 捕获处理 和 声明抛出 两种核心处理方式。

  1. 捕获处理:try-catch-finally

核心特点:

  • try 块不能单独存在,必须配合 catch 或 finally 。

​- 多个 catch 块遵循子类在前、父类在后的顺序(如先 NullPointerException 后 Exception )。

​- finally 块即使 try/catch 中有 return 语句,也会执行(除非执行 System.exit(0) 终止 JVM)。

  1. 声明抛出:throws 关键字

当方法内部不处理异常,而是将异常抛给调用者处理时,使用 throws 声明异常类型。

注意事项:

  • 运行时异常可省略 throws 声明,编译时异常必须声明或捕获。

​- 方法重写时,子类方法抛出的异常范围不能大于父类方法的异常范围。

  1. 主动抛出异常:throw 关键字

用于在代码中手动抛出异常对象,通常结合条件判断使用。

区别:

  • throw :用于方法内部,抛出具体的异常对象。

​- throws :用于方法声明,声明方法可能抛出的异常类型。

四、自定义异常

当 Java 内置的异常类型无法满足业务需求时,可自定义异常类。

  1. 自定义编译时异常

继承 Exception 类,编译时需强制处理。

  1. 自定义运行时异常

继承 RuntimeException 类,编译时无需强制处理。

  1. 自定义异常的使用

五、异常处理的最佳实践

  1. 避免捕获 Exception 父类:尽量捕获具体的异常类型,提高代码可读性和针对性。

  2. 不要空捕获 catch 块:至少打印异常信息( e.printStackTrace() ),便于排查问题。

​3. 合理使用 finally :仅用于释放资源,避免在 finally 中写业务逻辑。

​4. 运行时异常不滥用 throws :运行时异常(如空指针)应通过代码预判避免,而非依赖 throws 抛给上层。

​5. 自定义异常要有明确的业务含义:异常名和信息要清晰,便于定位问题。

六、常见异常汇总

异常类型 异常说明 异常类别

NullPointerException 空指针异常,调用了 null 对象的方法 运行时异常

ArrayIndexOutOfBoundsException 数组下标越界 运行时异常

ArithmeticException 算术异常(如除零) 运行时异常

IllegalArgumentException 非法参数异常 运行时异常

IOException I/O 操作异常(如文件读取失败) 编译时异常

ClassNotFoundException 类找不到异常 编译时异常

相关推荐
j7~39 分钟前
【Linux】二十六.线程篇三《Linux多线程编程:线程控制、线程ID以及进程地址空间分布、线程局部存储__thread以及clone系统调用》---详解
linux·运维·服务器·开发语言·c++·多线程编辑·线程的控制
维吉斯蔡8 小时前
【VS Code / Cursor】文件夹右键快捷打开与文件类型自动关联
开发语言·程序人生·学习方法
一米阳光86618 小时前
软考(中级)软件设计师核心笔记(3)数据库系统——概念、数据库设计
数据库·笔记·职场发展·软考·软件设计师
蓝斯4978 小时前
[原创]《C#高级GDI+实战:从零开发一个流程图》第章:增加贝塞尔曲线,上、下、左、右连接点
java·c#·流程图
前端工作日常9 小时前
我学习到的Java 的 Service 分层:itf 和 impl 到底是什么?
java·后端
漏刻有时9 小时前
PHP GeoJSON转PNG地图渲染程序开发笔记、源码解读、问题复盘与整改方案
android·笔记·php
都叫我大帅哥9 小时前
Spring @Transactional 注解完全指南
java·spring
Java成神之路-9 小时前
G1 垃圾回收器 :SATB + TAMS核心机制深度解析
java·jvm
暗影凋落9 小时前
CMake构建学习笔记-SQLite库的构建
笔记·学习·sqlite
前端工作日常10 小时前
我学习到的JIT即时编译与机器码缓存失效
java·后端