首页 > 解决方案 > 使用 List 的方法中的“意外返回值”

问题描述

我想首先指出我对编码很陌生,所以这看起来很简单,但我就是想不通。

我正在处理一个使用 JXBrowser 从网站提取信息的现有项目。它从网站对象中选择具有该方法的所有元素getRecords()并将其放入List<Element>(部分import java.util.List)中。这段代码是浏览器管理器类中的一个方法,它创建和处理 JX​​Browser 实例。

我希望该saveRecords()方法从网站中提取数据并将列表返回给我的主要作业执行器。但是,我的 IDE 将该return records部分标记为错误 - “意外的返回值”。

我怀疑这可能与使用匿名方法有关,我自己没有写,也没有任何经验。

   public List<Element> saveRecord() {

    if (website != null) {

        browser.mainFrame().ifPresent(frame -> frame.document().ifPresent(document -> {

            List <Element> records = website.getHandler().getRecords(document);

            if (records.isEmpty()) {
                log.error("no record found on site!");
            } else {
                return records;
            }

        }));
    } else {
        log.error("no handler found!");
    }
}

标签: javareturnjxbrowser

解决方案


你没有从你的方法返回任何东西,它应该返回一个List<Element>. 另一方面,您从传递给的函数 (lambda) 返回(但并非在所有情况下)Optional.ifPresent(),尽管 lambda 应该是 a Consumer,因此不应该返回任何东西。

如果您不了解作为回调传递给方法的函数(lambdas)的原理,我建议您在使用它们之前先研究一下。或者继续使用命令式编程,只需使用Optional.isPresent()followOptional.get()来测试可选项是否有值,如果存在则获取它。

如果你想使用函数式编程,那么你不应该使用ifPresent(). 您应该改用map(),flatMap()并将orElse您的 Optional 转换为一个值。

在所有情况下,您需要决定的第一件事是如果记录为空该怎么办,以及如果网站为空怎么办。你不能只是不做任何你想做的事情。要么你返回一些东西(例如一个空列表),要么你抛出一个异常。但是您不能只记录不返回。


推荐阅读