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

extracting "throw new exception" into a method causes compile error

我有以下功能:

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() 的方法中时,我发现:

我想知道这是为什么。

有没有办法将 C 提取到方法中?

void 之外的任何具有 return 类型的方法都必须 return 该类型的值,否则抛出异常以结束方法执行。

在您当前的状态下,您的方法将抛出异常以结束方法执行,但是如果您将 C part 移动到另一个方法,那么您的 retrieveBox 方法必须 return 类型为 Box正常完成。

因此 eclipse 正在抱怨。