将“抛出新异常”提取到方法中会导致编译错误

时间:2016-05-19 17:49:00

标签: java exception refactoring

我有以下功能:

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提取到方法中?

1 个答案:

答案 0 :(得分:1)

除了void之外,任何返回类型的方法都必须返回该类型的值,或者为结束方法执行抛出异常。

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

因此eclipse抱怨。