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

为何divide函数未在try块调用时,未触发未捕获ArithmeticException报错?

问题原因与解决办法

为啥直接调用不报错?

你用的ArithmeticException是Java里的运行时异常,这类异常属于“编译器不会强制要求处理”的类型——也就是说,哪怕你不写try-catch,编译器也不会拦着你,只有在运行时真的触发异常(比如除数为0)的时候才会报错。这就是为啥你直接调用divide没出现编译错误的原因。

怎么强制必须在try块里调用?

要实现这个限制,得自定义一个检查型异常(也就是编译器会盯着你处理的异常)。具体做法如下:

修改后的代码示例

class Main {
    public static void main(String[] args) {
        // 这里必须套try-catch,不然编译器直接报错
        try {
            System.out.println(Main.divide(5.0f, 2.0f));
            System.out.println(divide(5.0f, 2.0f));
        } catch (DivideByZeroException e) {
            System.out.println(e.getMessage());
        }
    }

    static float divide(float x, float y) throws DivideByZeroException {
        if (y == 0)
            throw new DivideByZeroException("Cannot divide by 0!");
        else
            return x/y;
    }
}

// 自定义检查型异常,直接继承Exception即可
class DivideByZeroException extends Exception {
    public DivideByZeroException(String message) {
        super(message);
    }
}

原理说明

自定义的DivideByZeroException继承自Exception(而非RuntimeException),属于检查型异常。此时编译器会强制要求所有调用divide的地方,要么用try-catch捕获异常,要么在调用方法上声明抛出这个异常,刚好满足你“必须在try块中调用”的限制需求。

内容的提问来源于stack exchange,提问作者Mr. Developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:25:18