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

方法调用时的异常处理:Position构造方法的InvalidPositionException实现咨询

正确实现Position构造方法的异常处理

你的现有代码存在一个核心问题:在构造方法内部抛出InvalidPositionException后又直接捕获,却没有将异常传递给调用者——这会导致调用者误以为位置对象创建成功,但实际上参数是非法的,甚至可能得到一个未正确初始化的Position实例。

下面是两种合理的实现方案:

方案一:直接抛出异常(推荐)

既然构造方法已经声明了throws InvalidPositionException,最简洁且符合设计意图的方式是移除内部的try-catch块,直接验证参数并抛出异常,把异常的处理权交给调用者:

public Position(int x, int y) throws InvalidPositionException {
    // 验证坐标范围
    if (x > 10 || x < 1 || y > 10 || y < 1) {
        throw new InvalidPositionException("Position x = " + x + ", y = " + y + " is out of bounds");
    }
    // 参数合法时初始化
    setX(x);
    setY(y);
}

这样做的好处是:

  • 调用者必须显式处理这个异常(要么用try-catch捕获,要么继续向上抛出),避免了无效对象被默默创建的风险。
  • 代码逻辑清晰,职责明确:构造方法只负责验证参数和初始化,异常处理由上层调用者根据业务场景决定(比如提示用户输入合法坐标、使用默认位置等)。

方案二:记录日志后重新抛出异常

如果需要在构造方法内部记录异常日志(比如排查问题需要),那么捕获异常后必须重新抛出,不能吞掉:

public Position(int x, int y) throws InvalidPositionException {
    try {
        if (x > 10 || x < 1 || y > 10 || y < 1) {
            throw new InvalidPositionException("Position x = " + x + ", y = " + y + " is out of bounds");
        }
        setX(x);
        setY(y);
    } catch (InvalidPositionException e) {
        // 记录异常日志
        System.err.println("Failed to create Position: " + e.getMessage());
        // 重新抛出异常,让调用者感知到错误
        throw e;
    }
}

这种方式既保留了日志记录的需求,又保证了异常的传递性,调用者仍然能收到参数非法的信号。

为什么你的现有代码不对?

你原本的代码在catch块里只打印了日志,却没有重新抛出异常——这会导致:

  • 调用者无法得知参数非法,可能会继续使用这个未正确初始化的Position对象,引发后续逻辑错误。
  • 异常的设计目的(通知上层错误)被破坏,变成了一个只有控制台能看到的“静默错误”。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:54:41