将"throw new exception"提取到方法中会导致编译错误



我有以下功能:

private Box retrieveBox() {
    BoxParameter param = new BoxParameter("red", 10, 5, 3);
    List<Long> boxIds = boxDao.retrieveByParameter(param);
    if (boxIds.isEmpty()) {
        // A
        logger.warn("box not found");
        throw new BoxNotFoundException();
    }
    if (boxIds.size() > 1) {
        // B
        logger.warn("multiple boxes found");
        throw new MultipleBoxesFoundException();
    }
    Optional<Box> maybe = boxDao.retrieve(boxIds.get(0));
    if (maybe.isPresent()) {
        return maybe.get();
    }
    // C
    logger.warn("box not found");
    throw new BoxNotFoundException();
} 

当我尝试将日志记录和异常重构为一个名为logWarningAndThrowException()的方法时,我发现:

  • A和B可以重构
  • 如果将C提取到方法中,Eclipse会提示"此方法必须返回Box类型的结果"

我想知道为什么。

有没有一种方法可以将C提取到方法中?

任何具有除void以外的返回类型的方法都必须返回该类型的值或引发异常以结束方法执行。

在当前状态下,方法将抛出异常以结束方法执行,但如果将C part移动到另一个方法,则retrieveBox方法必须返回类型为Box的值才能正常完成。

因此,日食在抱怨。

最新更新