一文详解Java中三大异常处理方式(try-catch、throw、throws)

 更新时间:2026年01月11日 15:25:55   作者:只有Java懂我  
这篇文章主要介绍了Java中三大异常处理方式的相关资料,分别是try-catch、throw、throws,try-catch、throw、throws,try-catch用于捕获和处理异常,throw用于显式抛出异常,throws用于声明方法可能抛出的异常,需要的朋友可以参考下

前言

这三种方式(try-catchthrowthrows)是 Java 异常处理的三大基石。要搞懂它们,最重要的是明白它们分别处于异常处理流程中的哪个环节

1. try-catch:自己处理(捕获与解决)

这是 Java 处理异常最直接的方式,用于在代码内部捕获异常并进行处理,从而保证程序能继续运行。

  • 定义位置:方法体内部。
  • 结构组成:由 try 块和一个或多个 catch 块组成(还可以包含 finally 块)。
  • 执行逻辑
    1. try 块:包裹可能抛出异常的代码段。程序正常执行时,逐行执行 try 块内的代码。
    2. 异常触发:如果 try 块中的某行代码抛出异常,try 块中剩余的代码将不再执行,程序立即跳转到与异常类型匹配的 catch 块。
    3. catch 块:捕获特定类型的异常对象。在 catch 块中编写处理该异常的逻辑(如日志记录、恢复操作、提示用户等)。如果没有异常发生,catch 块将被跳过。
  • 作用:将异常处理逻辑与正常业务逻辑分离,防止因异常导致程序非正常终止。

语法详解

try {
    // 1. try 块:放可能出现问题的代码( risky code )
    int result = 10 / 0; // 这里会抛出 ArithmeticException 异常
    System.out.println("这行代码不会执行,因为上面出错了");
} catch (ArithmeticException e) {
    // 2. catch 块:如果 try 里的代码真的出错了,就会跳到这里来执行
    System.out.println("哎呀,除数不能为0!补救措施:把除数改为1");
    
    // e 就是捕获到的那个异常对象,你可以用它打印错误信息
    e.printStackTrace(); 
}
System.out.println("程序继续运行...");
  • 关键点
    • try:监控代码。
    • catch:匹配异常类型(如 ArithmeticException)。如果 try 里抛出的异常和 catch 括号里的类型一致(或是其子类),就进入 catch 块执行。
    • 执行顺序:一旦 try 中某行出错,直接跳过 try 剩余代码,进入对应的 catch。
    • 多重 catch:你可以写多个 catch 来处理不同的异常,就像准备不同的急救包。

补充:

finally:最终执行块

  • 定义:位于 try-catch 结构之后的代码块。
  • 核心特性:无论 try 块中是否发生异常,也无论是否执行了 return 语句,finally 块中的代码一定会执行
  • 主要作用:用于资源释放。通常在代码执行完毕后,关闭文件流、数据库连接或释放锁,确保不占用系统资源。
  • 唯一例外:如果在 trycatch 中执行了 System.exit(0) 强制终止 JVM,或者发生了断电宕机,finally 才不会执行。

2. throw:主动制造(抛出异常)

这是一个动作关键字,用于在代码中显式地生成并抛出一个异常对象。它不是“处理”异常,而是“制造”异常。

  • 定义位置:方法体或代码块内部。
  • 操作对象:后面必须跟一个 Throwable 类及其子类的实例化对象。
  • 执行逻辑
    1. 程序执行到 throw 语句时,会立即停止当前方法的后续代码执行。
    2. 它将创建的异常对象抛出给 Java 运行时系统。
    3. 如果该 throw 语句未包裹在 try-catch 块中,或者 catch 块未捕获该异常,则该方法将立即结束,并将异常抛给该方法的调用者。
  • 作用:通常用于业务逻辑校验。当程序状态不符合预期(如参数非法、状态错误)时,主动中断流程并向上层报告错误。

语法详解

public void checkAge(int age) {
    // 逻辑判断:如果年龄是负数,这不符合逻辑
    if (age < 0) {
        // 主动创建一个异常对象,并用 throw 关键字抛出
        // 就像你主动点燃了引信,扔出手雷
        throw new IllegalArgumentException("年龄不能是负数!");
    }
    
    System.out.println("年龄检查通过:" + age);
}
  • 关键点
    • throw 写在方法内部
    • throw 后面必须跟一个异常对象new ...)。
    • 一旦执行到 throw当前方法立即结束(就像遇到 return 一样),后面的代码不再执行,控制权交给调用者。

3. throws:声明推卸(声明异常)

这是一个声明关键字,用在方法签名上。它表示当前方法不处理某些异常,而是将异常的处理责任推给调用该方法的上层代码。

  • 定义位置:方法声明中,参数列表之后,方法体之前。
  • 操作对象:后面跟异常类名(可以多个,用逗号分隔),不是对象实例。
  • 执行逻辑
    1. 声明该方法在执行过程中可能会抛出指定类型的异常。
    2. 当调用者调用该方法时,编译器会强制要求调用者必须处理这些声明的异常(通过 try-catch 捕获,或者在自身的声明中使用 throws 继续向上抛出)。
  • 作用:明确了方法的风险边界,实现了异常处理的传递(冒泡机制),让方法的调用者决定如何处理底层发生的异常。

语法详解

// 在方法定义时,使用 throws 关键字声明可能抛出的异常列表
// 告诉调用者:调用我时,可能会遇到 FileNotFoundException,你自己看着办!
public void readFile(String filePath) throws FileNotFoundException {
    
    // 这里不需要 try-catch
    // 如果文件真的找不到,JVM 会抛出 FileNotFoundException
    // 这个异常会顺着调用链,扔给调用 readFile 的人去处理
    FileInputStream fis = new FileInputStream(filePath); 
}
  • 调用者怎么处理?
    当别人调用 readFile 方法时,编译器会强制要求调用者处理这个异常(要么 try-catch 接住,要么继续 throws 往上甩)。
public static void main(String[] args) {
    try {
        // 调用者必须用 try-catch 包裹,或者 main 方法也 throws
        readFile("test.txt");
    } catch (FileNotFoundException e) {
        System.out.println("文件没找到,我负责处理:新建一个文件");
    }
}
  • 关键点
    • throws 写在方法声明后面(括号外面)。
    • 后面跟的是异常类名(可以多个,用逗号隔开),不是对象。
    • 它是一种**“甩锅”**机制:将异常的处理责任转移给上层调用者。

总结串联:它们是如何配合工作的?

让我们把这三个关键词串联在一个完整的业务逻辑中:

假设我们有一个银行转账的功能:

public class BankService {
    
    // 1. throws 声明:
    //    这个方法告诉外界:“我可能会遇到钱不够的情况,调用者要准备好处理”
    public void transfer(double amount) throws InsufficientFundsException {
        
        if (amount < 0) {
            // 2. throw 抛出:
            //    程序员发现逻辑错误(转账金额为负),主动制造异常扔出去
            throw new IllegalArgumentException("转账金额不能是负数!");
        }
        
        if (balance < amount) {
            // 3. throw 抛出:
            //    发现余额不足,主动制造一个“余额不足异常”扔出去
            //    因为方法签名上有 throws,这里可以直接扔,不用自己 catch
            throw new InsufficientFundsException("余额不足,转账失败");
        }
        
        // 正常扣款逻辑...
    }
}

// 调用者
public class Main {
    public void doTransfer() {
        BankService bank = new BankService();
        
        // 4. try-catch 捕获:
        //    因为 bank.transfer() 声明了会扔出异常,所以这里必须接住
        try {
            bank.transfer(1000);
        } catch (InsufficientFundsException e) {
            // 处理余额不足的情况
            System.out.println("提示用户:充值");
        } catch (IllegalArgumentException e) {
            // 处理参数错误的情况
            System.out.println("提示用户:金额非法");
        }
    }
}

总结对比

关键字类别出现位置核心作用
try-catch处理机制方法体内部拦截异常,就地解决,保证当前流程不中断。
throw动作方法体内部制造异常,显式抛出一个异常对象,中断当前流程。
throws声明方法签名上声明异常,告知上层调用者这里可能出错,需由调用者处理。

到此这篇关于Java中三大异常处理方式(try-catch、throw、throws)的文章就介绍到这了,更多相关Java异常处理try-catch、throw、throws内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring Cloud Gateway动态路由Apollo实现详解

    Spring Cloud Gateway动态路由Apollo实现详解

    这篇文章主要为大家介绍了Spring Cloud Gateway动态路由通过Apollo实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • SpringSecurity 默认登录认证的实现原理解析

    SpringSecurity 默认登录认证的实现原理解析

    这篇文章主要介绍了SpringSecurity 默认登录认证的实现原理解析,本文通过图文示例相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-12-12
  • Java 截取视频资料中的某一帧作为缩略图

    Java 截取视频资料中的某一帧作为缩略图

    最近项目中有一个需求,就是Java 截取视频资料中的某一帧作为缩略图,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Spring Boot项目中遇到`if-else`语句七种具体使用方法解析

    Spring Boot项目中遇到`if-else`语句七种具体使用方法解析

    当在Spring Boot项目中遇到大量if-else语句时,优化这些代码变得尤为重要,因为它们不仅增加了维护难度,还可能影响应用程序的可读性和性能,以下是七种具体的方法,用于在Spring Boot项目中优化和重构if-else语句,感兴趣的朋友一起看看吧
    2024-07-07
  • 详解Java枚举与接口常量和类常量的区别

    详解Java枚举与接口常量和类常量的区别

    这篇文章主要为大家详细介绍了Java中枚举与接口常量、类常量有什么区别,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的可以了解一下
    2022-10-10
  • 详解在Spring3中使用注解(@Scheduled)创建计划任务

    详解在Spring3中使用注解(@Scheduled)创建计划任务

    本篇文章主要介绍了详解在Spring3中使用注解(@Scheduled)创建计划任务,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • 基于SpringBoot实现抽奖活动的四种策略

    基于SpringBoot实现抽奖活动的四种策略

    抽奖活动是产品运营中常见的用户激励和互动手段,通过随机性和奖励刺激用户参与度,提升用户活跃度和留存率,在技术实现上,抽奖系统涉及到随机算法、奖品分配、防作弊机制等多方面内容,本文将介绍基于SpringBoot实现抽奖活动的5种策略,需要的朋友可以参考下
    2025-06-06
  • IDEA如何解决properties文件乱码问题

    IDEA如何解决properties文件乱码问题

    IDEA编辑器中打开properties文件时出现中文乱码,可以通过修改文件编码格式来解决,具体步骤为:设置》Setting》Editor》FileEncodings,将编码格式更改为UTF-8
    2025-01-01
  • java中的instanceof关键字详细解读

    java中的instanceof关键字详细解读

    这篇文章主要介绍了java中的instanceof关键字详细解读,instanceof 是 Java 的保留关键字,它的作用是测试它左边的对象是否是它右边的类的实例,返回 boolean 的数据类型,需要的朋友可以参考下
    2024-01-01
  • SpringBoot整合RedisTemplate实现缓存信息监控的基本操作

    SpringBoot整合RedisTemplate实现缓存信息监控的基本操作

    SpringBoot中的 redistemplate 是一个用于操作 Redis 数据库的高级模板类,它提供了一组方法,可以方便地执行常见的 Redis 操作,如存储、检索和删除数据,本文给大家介绍了SpringBoot整合RedisTemplate实现缓存信息监控的基本操作,需要的朋友可以参考下
    2025-02-02

最新评论