当前位置: 首页 > news >正文

Java中的异常及异常处理

异常的概念

异常是指在程序运行过程中发生的不正常事件,它会中断程序的正常执行流程。Java中的异常机制提供了一种结构化的方法来处理运行时错误,使程序能够优雅地处理错误情况而不是直接崩溃。例如,当试图访问空对象的成员时,会抛出NullPointerException;当数组索引超出范围时,会抛出ArrayIndexOutOfBoundsException。

异常分类

运行时异常(RuntimeException)

运行时异常又称非检查异常(unchecked exceptions),是RuntimeException类及其子类。这类异常通常由程序逻辑错误引起,编译器不强制要求处理,但可能会导致程序终止。常见例子包括:

  • NullPointerException:试图访问空对象的成员
  • ArrayIndexOutOfBoundsException:数组索引越界
  • ClassCastException:类型转换错误
  • ArithmeticException:算术运算异常,如除以零

编译时异常(Exception)

编译时异常又称检查异常(checked exceptions),是Exception类中除RuntimeException以外的异常。编译器会强制要求处理这类异常,否则程序无法通过编译。常见例子包括:

  • IOException:IO(input/output)-输入输出异常
  • SQLException:数据库访问异常
  • FileNotFoundException:文件未找到异常
  • ClassNotFoundException:类加载异常
  • InterruptedException:一个线程被另一个线程中断,抛出该异常。

异常体系结构

Java的异常体系采用层次结构,以Throwable为顶层父类:

Throwable
├── Error (系统严重错误,如OutOfMemoryError,通常无法恢复)
└── Exception├── RuntimeException (运行时异常)└── 其他Exception (编译时异常)

异常处理

try-catch-finally块

使用try…catch语句处理异常时,异常会在内部被捕获和处理,不会传递给JVM,程序可以继续正常执行。

try {// 可能抛出异常的代码FileInputStream fis = new FileInputStream("test.txt");// 其他操作...
} catch (FileNotFoundException e) {// 处理文件未找到异常System.out.println("文件未找到: " + e.getMessage());
} catch (IOException e) {// 处理其他IO异常e.printStackTrace();
} finally {// 无论是否发生异常都会执行的代码// 常用于资源释放if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}
}

throw关键字

用于在方法内部主动抛出异常:

public void withdraw(double amount) {if (amount > balance) {throw new IllegalArgumentException("余额不足");}balance -= amount;
}

注意:抛出异常后,Java虚拟机将终止后续代码的执行,除非使用finally块进行包裹处理。

throws关键字

用于声明方法可能抛出的异常,将异常处理责任转移给上一级调用者:

public void readFile(String path) throws FileNotFoundException {FileInputStream fis = new FileInputStream(path);// 文件操作...
}

最佳实践

  1. 针对不同的异常类型使用多个catch块,从具体到一般
  2. 在finally块中释放资源(如文件流、数据库连接)
  3. 不要捕获异常后什么都不做(空的catch块)
  4. 自定义异常时继承适当的异常类
  5. 记录异常信息时使用日志系统而不是简单的printStackTrace()
  6. 考虑异常对性能的影响,避免过度使用异常处理
http://www.lqws.cn/news/561727.html

相关文章:

  • JDK17的GC调优
  • SpringCloud Stream 使用
  • Youtube双塔模型
  • 第27篇:SELinux安全增强机制深度解析与OpenEuler实践指南
  • eTools 开源发布
  • 如何在 Ubuntu 上通过终端或在 VirtualBox 中安装 GCC
  • 佳能Canon PIXMA G1020打印机信息
  • scGPT-spatial 复现
  • KS值:风控模型的“风险照妖镜”
  • Transformer结构--输入编码(BPE,PE)
  • Java面向对象(一)
  • JVM 之双亲委派机制与打破双亲委派
  • 【软考高项论文】论信息系统项目的进度管理
  • 【C++】简单学——类和对象(实现双向循环链表)
  • Python基础(吃洋葱小游戏)
  • Java Optional 详解:优雅处理空指针异常
  • 顺序表应用实践:从通讯录实现到性能优化深度解析
  • 有理函数积分——分式分解时设分解式的规则
  • Fine-Tuning Vision-Language-Action Models:Optimizing Speed and Success论文学习
  • SQL关键字三分钟入门:ROW_NUMBER() —— 窗口函数为每一行编号
  • FreeSWITCH配置文件解析(2) dialplan 拨号计划中xml 的action解析
  • 第一章 从零开始学习大型语言模型-搭建环境
  • 人大金仓数据库jdbc连接jar包kingbase8-8.6.0.jar驱动包最新版下载(不需要积分)
  • 5G核心网,NAS短消息的实现
  • 可编程逻辑器件的发展与比较
  • 构建 AI 系统的 4 大 Agentic AI 设计模式
  • Python 可迭代的对象、迭代器 和生成器(何时使用生成器表达式)
  • 2099. 找到和最大的长度为 K 的子序列
  • 第6篇:中间件——Gin的请求处理管道
  • 大事件项目记录10-文章分类接口开发-更新文章分类