java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java异常处理try-catch、throw、throws

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

作者:只有Java懂我

这篇文章主要介绍了Java中三大异常处理方式的相关资料,分别是try-catch、throw、throws,try-catch、throw、throws,try-catch用于捕获和处理异常,throw用于显式抛出异常,throws用于声明方法可能抛出的异常,需要的朋友可以参考下

前言

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

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

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

语法详解

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("程序继续运行...");

补充:

finally:最终执行块

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

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

语法详解

public void checkAge(int age) {
    // 逻辑判断:如果年龄是负数,这不符合逻辑
    if (age < 0) {
        // 主动创建一个异常对象,并用 throw 关键字抛出
        // 就像你主动点燃了引信,扔出手雷
        throw new IllegalArgumentException("年龄不能是负数!");
    }
    
    System.out.println("年龄检查通过:" + age);
}

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

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

语法详解

// 在方法定义时,使用 throws 关键字声明可能抛出的异常列表
// 告诉调用者:调用我时,可能会遇到 FileNotFoundException,你自己看着办!
public void readFile(String filePath) throws FileNotFoundException {
    
    // 这里不需要 try-catch
    // 如果文件真的找不到,JVM 会抛出 FileNotFoundException
    // 这个异常会顺着调用链,扔给调用 readFile 的人去处理
    FileInputStream fis = new FileInputStream(filePath); 
}
public static void main(String[] args) {
    try {
        // 调用者必须用 try-catch 包裹,或者 main 方法也 throws
        readFile("test.txt");
    } catch (FileNotFoundException e) {
        System.out.println("文件没找到,我负责处理:新建一个文件");
    }
}

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

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

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

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

您可能感兴趣的文章:
阅读全文