我在发布这个问题之前已经提到了这一点 Checking Null Wrappers against primitive values
我的情况是,我想用{strong> Wrapper Integer
以及 null
0
if( statusId != null || statusId != 0 ) //statusId is Integer it maybe 0 or null
// Do Somethimg here
我如何克服这种情况?
答案 0 :(得分:7)
将or
替换为and
:
if( statusId != null && statusId != 0 )
只有当statusId
不是null
时才会有效:
statusId != null
您将尝试将statusId
取消装箱到int
:
statusId != 0
如果statusId
为null
,则短路&&
运算符将阻止抛出NullPointerException
,因为statusId != 0
将不会被评估点。
答案 1 :(得分:1)
如果你想摆脱null
检查,那么你可以使用equals
,例如:
Integer i = null;
if(Integer.valueOf(0).equals(i)){
System.out.println("zero");
}else{
System.out.println("not zero");
}
答案 2 :(得分:1)
问题是你让null通过第二次检查,并得到一个空指针。
等效工作逻辑:
if (!(statusId == null || statusId == 0)) {
}
答案 3 :(得分:0)
在这个帖子中已经有很多好的'经典'Java答案了,所以为了它...这里是Java 8:使用OptionalInt
。
假设statusId
是OptionalInt
,您可以写:
if(statusId.isPresent() && statusId.getAsInt() != 0)
或稍微更加隐秘,你可以这样做:
if(statusId.orElse(0) != 0)
在这种情况下,statusId
永远不会设置为null;相反,它设置为OptionalInt.of(<some int>)
,OptionalInt.ofNullable(<some Integer>)
或OptionalInt.empty()
。
这个答案的要点是,从Java 8开始,标准库为基元提供方便的Optional
和相关类来编写空安全Java代码。你可能想看看它们。 Optional
因其filter
和map
方法而特别方便。
答案 4 :(得分:0)
刚才意识到为什么这个问题伤害了这么多。 实际上 关于一个错字(如果是这样,@ davidxxx&#39;答案是正确的)。它与逻辑等同性无关。
但是,它的价值在哪里。问题具体要求:
if( statusId != null || statusId != 0 )
即。 &#34;如果它不是空的&#34;它进入。或者&#34;如果它不是零&#34;它就会进入。
所以,实际上,解决方案是:
if (true)
答案 5 :(得分:0)
我不知道您的确切上下文,但您可以考虑使用Apache Commons Lang中的空值安全方法,例如:
if (ObjectUtils.defaultIfNull(statusId, 0) != 0)
// Do Somethimg here