检查 Integer Wrapper 是否为 NULL 以及原始值 0
Checking Integer Wrapper against NULL as well as primitive value 0
我在发布这个问题之前参考了这个。
Checking Null Wrappers against primitive values
而且我有情况想用 null
检查 Wrapper Integer
以及 0
if( statusId != null || statusId != 0 ) //statusId is Integer it maybe 0 or null
// Do Somethimg here
我该如何克服这种情况?
将or
替换为and
:
if( statusId != null && statusId != 0 )
它会起作用,因为只有 statusId
不是 null
:
statusId != null
您将尝试将 statusId
拆箱为 int
:
statusId != 0
并且在 statusId
是 null
的情况下,短路 &&
运算符将阻止抛出 NullPointerException
,因为 statusId != 0
不会待评价。
如果你想摆脱null
检查那么你可以使用equals
,例如:
Integer i = null;
if(Integer.valueOf(0).equals(i)){
System.out.println("zero");
}else{
System.out.println("not zero");
}
问题是您让 null 通过了第二次检查,并得到了一个空指针。
等效的工作逻辑:
if (!(statusId == null || statusId == 0)) {
}
这个线程中已经有很多好的 'classic' Java 答案,所以为了它...这里有一个 Java 8 一个:使用 OptionalInt
.
假设 statusId
是一个 OptionalInt
,你会写:
if(statusId.isPresent() && statusId.getAsInt() != 0)
或者更隐秘一点,你可以这样做:
if(statusId.orElse(0) != 0)
在这种情况下,statusId
永远不会设置为空;相反,它被设置为 OptionalInt.of(<some int>)
、OptionalInt.ofNullable(<some Integer>)
或 OptionalInt.empty()
。
这个答案的重点是,从 Java 8 开始,标准库提供了方便的 Optional
and related classes for primitives to write null-safe Java code. You might want to check them out. Optional
is especially handy, because of its filter
and map
方法。
刚刚意识到为什么这个问题如此痛苦。 实际上 打字错误(如果是这样,@davidxxx 的回答是正确的)。这与逻辑等价无关。
但是,物有所值。问题具体要求:
if( statusId != null || statusId != 0 )
即"If it isn't null" 它进来了。或者 "if it isn't zero",它进来了。
所以,实际上,解决方案是:
if (true)
我不知道您的确切上下文,但您可以考虑使用 Apache Commons Lang 中的空安全方法,例如
if (ObjectUtils.defaultIfNull(statusId, 0) != 0)
// Do Somethimg here
我在发布这个问题之前参考了这个。
Checking Null Wrappers against primitive values
而且我有情况想用 null
检查 Wrapper Integer
以及 0
if( statusId != null || statusId != 0 ) //statusId is Integer it maybe 0 or null
// Do Somethimg here
我该如何克服这种情况?
将or
替换为and
:
if( statusId != null && statusId != 0 )
它会起作用,因为只有 statusId
不是 null
:
statusId != null
您将尝试将 statusId
拆箱为 int
:
statusId != 0
并且在 statusId
是 null
的情况下,短路 &&
运算符将阻止抛出 NullPointerException
,因为 statusId != 0
不会待评价。
如果你想摆脱null
检查那么你可以使用equals
,例如:
Integer i = null;
if(Integer.valueOf(0).equals(i)){
System.out.println("zero");
}else{
System.out.println("not zero");
}
问题是您让 null 通过了第二次检查,并得到了一个空指针。
等效的工作逻辑:
if (!(statusId == null || statusId == 0)) {
}
这个线程中已经有很多好的 'classic' Java 答案,所以为了它...这里有一个 Java 8 一个:使用 OptionalInt
.
假设 statusId
是一个 OptionalInt
,你会写:
if(statusId.isPresent() && statusId.getAsInt() != 0)
或者更隐秘一点,你可以这样做:
if(statusId.orElse(0) != 0)
在这种情况下,statusId
永远不会设置为空;相反,它被设置为 OptionalInt.of(<some int>)
、OptionalInt.ofNullable(<some Integer>)
或 OptionalInt.empty()
。
这个答案的重点是,从 Java 8 开始,标准库提供了方便的 Optional
and related classes for primitives to write null-safe Java code. You might want to check them out. Optional
is especially handy, because of its filter
and map
方法。
刚刚意识到为什么这个问题如此痛苦。 实际上 打字错误(如果是这样,@davidxxx 的回答是正确的)。这与逻辑等价无关。
但是,物有所值。问题具体要求:
if( statusId != null || statusId != 0 )
即"If it isn't null" 它进来了。或者 "if it isn't zero",它进来了。
所以,实际上,解决方案是:
if (true)
我不知道您的确切上下文,但您可以考虑使用 Apache Commons Lang 中的空安全方法,例如
if (ObjectUtils.defaultIfNull(statusId, 0) != 0)
// Do Somethimg here