java中的异常

Java 中的异常处理机制是程序健壮性和容错性的重要保障。Java 异常体系基于 Throwable 类构建,分为 检查型异常(Checked Exceptions) 和 非检查型异常(Unchecked Exceptions)。以下是 Java 异常的结构和处理方式的详细说明:


一、异常体系结构

1. Throwable 类

所有异常类的根类,是 Error 和 Exception 的父类。

  • Error:表示 JVM 本身的严重问题,如 OutOfMemoryError、StackOverflowError,通常应用程序无法处理。
  • Exception:表示程序运行中可能出现的异常,可以通过 try-catch 捕获处理。

2. Exception 的子类

  • Checked Exceptions(受检异常):

    • 编译器强制要求处理的异常,如 IOException、SQLException。
    • 必须在代码中捕获或在方法签名中声明抛出(使用 throws)。
  • Unchecked Exceptions(非受检异常):

    • 继承自 RuntimeException,如 NullPointerException、ArrayIndexOutOfBoundsException。
    • 编译时不强制处理,运行时可能抛出。

二、异常处理机制

1. try-catch-finally 结构

java 复制代码
try {
    // 可能抛出异常的代码
} catch (ExceptionType1 e) {
    // 处理异常
} catch (ExceptionType2 e) {
    // 处理其他异常
} finally {
    // 总是执行,通常用于资源释放
}
  • try 块中执行可能抛出异常的代码。
  • catch 块按顺序匹配异常类型。
  • finally 块无论是否发生异常都会执行(除非 JVM 退出)。

2. throw 和 throws

  • throw:手动抛出一个异常对象。

    java 复制代码
    throw new IllegalArgumentException("参数错误");
  • throws:声明方法可能抛出的异常类型(用于受检异常)。

    java 复制代码
    public void readFile() throws IOException { ... }

三、自定义异常

Java 允许开发者定义自己的异常类,通常继承自 Exception 或 RuntimeException:

java 复制代码
public class MyCustomException extends Exception {
    public MyCustomException(String message) {
        super(message);
    }
}

使用示例:

java 复制代码
if (value < 0) {
    throw new MyCustomException("值不能为负数");
}

如果继承Exception实现自定义异常则需要手动处理异常,因为继承Exception实现的自定义异常数据受检异常,需要进行处理。如果继承RuntimeException实现的自定义异常,则不需要手动处理(提个问题:为什么RuntimeException明明继承了Exeption,为什么不需要处理?个人理解时jvm底层对继承了Exception和继承了RuntimeExeption分别做了不同的处理。)


四、常见异常类型

异常类名 描述
NullPointerException 访问空对象的属性或方法
ArrayIndexOutOfBoundsException 数组越界访问
ClassCastException 类型转换错误
IllegalArgumentException 方法接收到非法参数
IOException 输入输出异常,如文件读写失败
SQLException 数据库操作异常
InterruptedException 线程被中断

五、最佳实践

  1. 避免捕获所有异常(catch (Exception e)):应具体捕获需要处理的异常类型。

  2. 不要忽略异常 :捕获后应记录日志或处理,而非空 catch 块。

  3. 使用 try-with-resources(Java 7+):自动关闭资源。

    java 复制代码
    try (FileInputStream fis = new FileInputStream("file.txt")) {
        // 读取文件
    } catch (IOException e) {
        e.printStackTrace();
    }
  4. 合理使用受检异常与非受检异常:受检异常适用于可恢复的情况,非受检异常用于程序错误。


六、总结

Java 异常机制提供了结构化、可维护的错误处理方式。理解异常的分类、处理流程和最佳实践,有助于编写更健壮、可维护的代码。

相关推荐
程序猿DD5 小时前
OctaFuse Gateway 2.15.0:MCP 聚合、向量 Embeddings 与官方目录同步
后端·agent
余槐i7 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
需要8268 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
凤山老林9 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne10 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF10 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用
pride.li11 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
upala11 小时前
【仓颉语言入门 · 第二篇 第 6 课】
后端
罗丹丹Luna11 小时前
移动端显示“已提交”以后:SAP 与低代码集成该怎样暴露真实状态
后端·架构
码事漫谈11 小时前
因为太想讨好你,所以AI会骗你
后端