一文详解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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringCloud Feign请求头删除修改的操作代码

    SpringCloud Feign请求头删除修改的操作代码

    这篇文章主要介绍了SpringCloud Feign请求头删除修改,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • SpringBoot中SmartLifecycle的使用解析

    SpringBoot中SmartLifecycle的使用解析

    这篇文章主要介绍了SpringBoot中SmartLifecycle的使用解析,SmartLifecycle是一个扩展了Lifecycle接口,可以跟踪spring容器ApplicationContext刷新或者关闭的接口,实现该接口的实现类有特定的执行顺序,需要的朋友可以参考下
    2023-11-11
  • SpringBoot结合Redis配置工具类实现动态切换库

    SpringBoot结合Redis配置工具类实现动态切换库

    本文主要介绍了SpringBoot结合Redis配置工具类实现动态切换库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • IntellJ IDEA神器使用技巧(小结)

    IntellJ IDEA神器使用技巧(小结)

    这篇文章主要介绍了IntellJ IDEA神器使用技巧(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • 使用WebUploader实现分片断点上传文件功能(二)

    使用WebUploader实现分片断点上传文件功能(二)

    这篇文章主要为大家详细介绍了使用WebUploader实现分片断点上传文件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

    SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

    在 Spring Boot 项目中,使用 logback-spring.xml 配置屏蔽特定路径的日志有两种常用方式,文中的示例代码讲解详细,有需要的小伙伴可以了解下
    2025-06-06
  • java采用中文方式显示时间的方法

    java采用中文方式显示时间的方法

    这篇文章主要介绍了java采用中文方式显示时间的方法,实例分析了java时间操作及字符串转换的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • java开发微信分享接口的步骤

    java开发微信分享接口的步骤

    这篇文章主要为大家详细介绍了java开发微信分享接口的步骤,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • 全面解析Java main方法

    全面解析Java main方法

    main方法是我们学习Java语言学习的第一个方法,也是每个java使用者最熟悉的方法,每个Java应用程序都必须有且仅有一个main方法。这篇文章通过实例代码给大家介绍java main方法的相关知识,感兴趣的朋友跟随脚本之家小编一起学习吧
    2018-05-05
  • SpringBoot3集成Swagger3的详细教程

    SpringBoot3集成Swagger3的详细教程

    Swagger 3(OpenAPI 3.0)提供了更加强大和灵活的API文档生成能力,本教程将指导您如何在Spring Boot 3项目中集成Swagger3,并使用Knife4j作为UI界面,需要的朋友可以参考下
    2024-03-03

最新评论