2016-01-07 38 views
4

我处理以下方法:如何在检查方法内避免空指针访问警告?

boolean isNullOrEmpty(String s) { 
    return s == null || s.length() == 0; 
} 

麻烦的是,它不与@Nullable兼容。在下面的代码中,当不应该显示警告时,显示警告。

void test(@Nullable String s) { 
    if (!isNullOrEmpty(s)) { 
    s.length(); // warning : o may be null 
    } 
} 

有没有办法让这个警告消失,同时节省isNullOrEmptyNullable

+0

什么是IDE /您使用产生这一警告的框架? IntelliJ例如不会产生警告,这要归功于Object.isNull的方法契约:'!null-> false; null-> true'。 –

+1

根据您对@ Remi的回答发表的评论,我想知道您是否做了一个最小化,完整,可验证的示例。 (也就是说,它可能只比Minimal少一点?)我还在想,问题是否存在于你的'isNullOrEmpty(List)'方法中,或者使用它的返回的布尔值。 –

+0

这是Eclipse吗? –

回答

2

我认为如果你重构了一下使用Optional你会更好。

@NonNull Optional<String> optNullOrEmpty(@Nullable String s) { 
    if (s == null || s.length() == 0) 
    return Optional.empty(); 
    else 
    return Optional.of(s); 
} 

然后你可以使用它作为:

void test(@Nullable String s) { 
    @NonNull Optional<String> os = optNullOrEmpty(s); 
    if (os.isPresent()) { 
    @NonNull String s1 = os.get(); 
    s1.length(); // No warning :-) 
    } 
} 
+0

我喜欢它!我看到的唯一问题是重构成本('isNullOrEmpty'被称为很多)。 – fxm

+1

@fxm,是的,这是缺点。 OTOH,只要您打开@Nullable注释,就会产生技术债务。此时您必须以某种方式触及所有这些调用。并且完全基于我自己的主观经验,似乎'可选'和@Nullable齐头并进。 –

3

有没有理由不使用if(o!= null)?

Objects.isNull的目的是用作谓语: .filter(对象::参考isNull)

这个警告可能是一个错误,但。如果你真的想让它消失,你可以用@SuppressWarnings注释你的方法

+0

感谢您的答案!我知道这两个解决方案,但他们不是我要找的:SuppressWarnings对于“真实代码”太残酷了,而'!= null'就是我想要避免的 – fxm

+0

我很好奇因为你为什么希望避免使用!= null,它与lit.Objective.isNull(该方法只是做一个“return object == null;”)相同的东西 – Remi

+0

我有自定义函数执行'isNullOrEmpty'测试(在List , 例如)。这些函数与我用'isNull'描述的函数有相同的问题。 – fxm