Java 为什么这个函数可能返回null?
假设我有一个番石榴辅助函数Java 为什么这个函数可能返回null?,java,nullpointerexception,guava,Java,Nullpointerexception,Guava,假设我有一个番石榴辅助函数 private Function<Config, Predicate<String>> makeFunctionToCompareTwoPathStrings() throws ConfigException { return new Function<Config, Predicate<String>>() { @Override public Predicate<Stri
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());
一点冗余但有用的谓词。或显然让分析人员更清楚:):
我认为你得到的警告并不是来自对你的代码实际功能的非常聪明的分析。它可能只在Function.apply()方法上使用注释,该方法被声明为@Nullable
,这意味着允许apply()返回null。您的特定功能没有,但代码检查器不够聪明,无法知道。我认为您得到的警告并非来自对代码实际功能的非常聪明的分析。它可能只在Function.apply()方法上使用注释,该方法被声明为@Nullable
,这意味着允许apply()返回null。您的特定函数没有,但代码检查器不够聪明,无法知道。此时对象“config”(非大写c)是否为空?没有足够的信息来找出可能为空的内容。我们知道make….()
不会返回null,任何函数/谓词也不会返回null。所以它必须是config
,但问题中没有给出上下文。(我知道,我在这里有点自相矛盾:)Config.getInstance()
-这会返回什么?为了回答这些问题,Config.getInstance()
应该返回一个对象,我把它命名为Config
,它在调用getInput()
时会提供一个字符串,您也可能会给出一个空的测试字符串,如…(config).apply(“”
)在这里,警告不会消失。我想@jb nizet是对的。对象'config'(非大写c)在那一点上可能是空的吗?没有足够的信息来找出什么可能是空的。我们知道make….()
不会返回null,任何函数/谓词也不会返回null。所以它必须是config
,但问题中没有给出上下文。(我知道,我在这里有点自相矛盾:)Config.getInstance()
-这会返回什么?为了回答这些问题,Config.getInstance()
应该返回一个对象,我把它命名为Config
,它在调用getInput()
时会提供一个字符串,您也可能会给出一个空的测试字符串,如…(config).apply(“”
)在这里,警告不会消失。我想这是对的。
Predicates.or(makeFunctionToCompareTwoPathStrings().apply(config)).apply(config.getInput());