为什么这个函数可能会返回null?

时间:2015-06-05 09:30:21

标签: java nullpointerexception guava

想象一下,我有一个番石榴帮手功能

private Function<Config, Predicate<String>> makeFunctionToCompareTwoPathStrings() throws ConfigException {
    return new Function<Config, Predicate<String>>() {
        @Override
        public Predicate<String> apply(final Config config) {
            try {
                final Path input = computationThatMightThrowAnException();
                return new Predicate<String>() {
                    @Override
                    public boolean apply(String actual) {
                        return input.toAbsolutePath().toString().equalsIgnoreCase(actual);
                    }
                };
            } catch (ConfigException | URISyntaxException weDontReallyCareAboutItForThisTest) {
                log.error(weDontReallyCareAboutItForThisTest.getMessage());
            }
            // should always return a predicate if nothing returned yet, simply return an alwaysFalse predicate
            return Predicates.alwaysFalse();
        }
    };
}

当我使用它时:

修改

Config config = Config.getInstance();
makeFunctionToCompareTwoPathStrings().apply(config).apply(config.getInput());

我收到警告

  

取消引用可能的空指针

在最外面apply的这一行 - 谓词上的那一行 - 我不明白。

修改

有点多余但有用Predicates.or显然会让分析器更清楚:):

Predicates.or(makeFunctionToCompareTwoPathStrings().apply(config)).apply(config.getInput());

1 个答案:

答案 0 :(得分:4)

我认为您收到的警告并非来自对您的代码实际执行情况的非常明智的分析。它可能只使用Function.apply()方法上的注释,该方法声明为@Nullable,这意味着apply()允许返回null。您的特定功能没有,但代码检查器不够聪明,无法知道。