第五章 深入理解Java异常处理机制

文章目录


一、异常的基本概念

1.1 什么是异常

  • 定义:异常是指Java程序在运行时可能出现的错误或非正常情况,例如尝试访问不存在的文件或进行除零操作。
  • 异常类:Java中的所有异常都是Throwable类的子类,主要分为两大类:Error和Exception。

1.2 异常的分类

编译时异常(checked exception):

  • 定义:编译时异常是在编译期间被检查的异常,需要显式处理。
  • 常见类型:IOException, SQLException 等。

运行时异常(unchecked exception):

  • 定义:运行时异常是在程序运行时发生的异常,编译器不会检查。
  • 常见类型:NullPointerException, ArrayIndexOutOfBoundsException 等。

三、异常处理关键字

  • try:用于包裹可能抛出异常的代码块。
  • catch:用于捕获并处理特定类型的异常。
  • finally:无论是否发生异常,都会执行的代码块。
  • throw:用于主动抛出异常。
  • throws:用于声明方法可能抛出的异常类型。

四、try-catch-finally语句

4.1 try-catch语句

  • 作用:捕获并处理异常。

语法:

java 复制代码
try {
    // 可能抛出异常的代码
} catch (异常类型 异常变量名) {
    // 异常处理代码
}

代码示例:

java 复制代码
try {
    int[] array = new int[3];
    System.out.println(array[3]);
} catch (ArrayIndexOutOfBoundsException e) {
    System.out.println("捕获到数组越界异常: " + e.getMessage());
}

4.2 finally语句

  • 作用:无论是否捕获到异常,都会执行的清理代码块。

语法:

java 复制代码
try {
    // 可能抛出异常的代码
} catch (异常类型 异常变量名) {
    // 异常处理代码
} finally {
    // 总会执行的代码
}

代码示例:

java 复制代码
try {
    System.out.println("尝试执行某个操作");
    throw new RuntimeException("发生了错误");
} catch (RuntimeException e) {
    System.out.println("捕获到异常: " + e.getMessage());
} finally {
    System.out.println("这段代码总是会执行");
}

五、throws与throw关键字

5.1 throws关键字

  • 作用:声明方法可能抛出的异常,让调用者来处理。

语法:

java 复制代码
public void 方法名() throws 异常类型1, 异常类型2 {
    // 方法体,可能抛出异常
}

代码示例:

java 复制代码
public void testMethod() throws IOException {
    throw new IOException("输入输出异常");
}

5.2 throw关键字

  • 作用:在方法内部主动抛出异常。

语法:

java 复制代码
throw new 异常类型("异常信息");

代码示例:

java 复制代码
public void testMethod() {
    if (true) {
        throw new IllegalArgumentException("参数不合法");
    }
}

六、自定义异常

6.1 自定义异常类

  • 定义:根据需要创建特定的异常类型。

语法:

java 复制代码
public class 自定义异常类 extends Exception {
    public 自定义异常类(String message) {
        super(message);
    }
}

代码示例:

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

6.2 使用自定义异常

  • 场景:在特定条件下抛出自定义异常。

代码示例:

java 复制代码
public class DivisionOperation {
    public static int divide(int numerator, int denominator) throws NegativeDivisorException {
        if (denominator < 0) {
            throw new NegativeDivisorException("除数不能为负数");
        }
        return numerator / denominator;
    }

    public static void main(String[] args) {
        try {
            int result = divide(10, -2);
            System.out.println("结果是: " + result);
        } catch (NegativeDivisorException e) {
            System.out.println("发生异常: " + e.getMessage());
        }
    }
}
相关推荐
程序喵大人16 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
秋天的怀念_David16 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Raas10016 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
niucloud-admin17 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
专注仿真17 小时前
线性回归和逻辑回归算法详解
开发语言·人工智能·python·大模型训练·控制算法
霸道流氓气质17 小时前
智能客服组件:分层意图识别、RAG Advisor 与人工转接状态机的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
jimy118 小时前
C++ 中的 `T&&`:右值引用与转发引用
开发语言·c++
captain37618 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
呆呆虫1218 小时前
用 orjson 加速 SerpBase 响应解析:基准对比与注意事项
开发语言·php
心中有你021418 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法