You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两段Java代码中throws关键字的作用差异及必要性疑问

问题背景

你提供了两段Java代码,一段方法声明带有throws IllegalArgumentException,另一段没有,但两段代码运行输出完全一致,异常都能被main方法的catch块捕获。疑问是:为何仍需要使用throws关键字?

代码1(带throws声明)

public class ExceptionsTest {
    public static void funcThrowsException(int n) throws IllegalArgumentException{
        if(n == 0){
            throw new IllegalArgumentException("ex");
        }
    }

    public static void main(String[] args) {
        try{
            funcThrowsException(0);
        }catch (IllegalArgumentException e){
            System.out.println(e.getMessage());
        }

    }
}

代码2(无throws声明)

public class ExceptionsTest {
    public static void funcThrowsException(int n){
        if(n == 0){
            throw new IllegalArgumentException("ex");
        }
    }

    public static void main(String[] args) {
        try{
            funcThrowsException(0);
        }catch (IllegalArgumentException e){
            System.out.println(e.getMessage());
        }

    }
}

两段代码的运行输出

ex

Process finished with exit code 0
原因解析

首先要明确:IllegalArgumentException是运行时异常(RuntimeException子类),这类异常Java编译器不会强制要求方法声明throws,也不会强制调用者必须捕获,所以两段代码能正常运行且结果一致。但throws关键字依然有不可替代的作用:

  • 给调用者明确的风险提示
    方法签名里的throws相当于一份“异常说明书”,调用者不需要深入读方法内部代码,就能快速知道这个方法可能抛出的异常类型和触发场景,提前做参数校验或异常处理。如果不写,调用者只能靠猜或者读源码才能发现潜在风险,降低了代码的可读性和可维护性。

  • 统一代码规范,便于团队协作
    很多开发团队会要求即使是非受检异常,也要在方法签名中声明可能抛出的异常。这样能让代码的异常逻辑更清晰,和受检异常的声明规则保持一致,团队成员接手代码时能快速理解整体的异常处理设计,减少沟通成本。

  • 为后续代码扩展留有余地
    如果后续需要把这个异常换成受检异常(比如IOException),或者需要在方法中新增其他受检异常,已有的throws声明能让修改更顺畅,不需要大幅调整方法签名的结构。另外,当上层代码需要统一处理多个方法的异常时,明确的throws声明能让上层的catch逻辑更有条理。


内容的提问来源于stack exchange,提问作者miao sun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 12:43:28