鉴于以下内容:
Integer var1 = null;
Integer var2 = 4;
Integer result = var1 + var2; // throws NullPointerException
只要操作数为result
, null
应为null
(同样适用于其他运算符)。我知道我可以使用if
语句来做到这一点但是有更聪明的方法吗?
答案 0 :(得分:9)
最好的方法是不要使用盒装类型进行常规算术运算。改为使用原始类型。
只有当你在某个地方的馆藏中使用它们时,你才应该使用盒装类型。
编辑:
结合来自@Ingo的建议,在Guava中有一个很好的实用程序类Optional
,它解释了如何避免空值。
现在使用此类可以明确表示值可以是null
。
答案 1 :(得分:3)
Integer var1 = null;
Integer var2 = 4;
Integer result = (var1 == null || var2 == null) ? null : var1 + var2; // returns null if either argument is null
答案 2 :(得分:2)
不幸的是,除了明确检查NullPointerException
之外,Java中没有其他方法可以阻止null
盒装类型。
同样适用于.equals()
,您可以这样做:
Integer var1 = null;
Integer var2 = 4;
var1 == var2
但是如果你想比较值:
Integer var1 = null;
Integer var2 = 4;
var1.equals(var2) //throws NullPointerException
这就是为什么在2011年向Java引入了两个参数static Object::equals
(参见here)。
盒装数字没有这种方法(如Integer
)。事实上,在var1 + var2
期间,您会自动取消装箱,从而导致异常。所以你不是要添加两个Integer
,而是在它们两个上调用.intValue()
,然后从结果中构造一个新的Integer。
有关盒装数字的更多信息,请参阅此Stack Overflow答案:Unboxing Long in java。
对不起,这是Java的一个令人讨厌的问题。如果您使用Integer
,请每次检查null
。
答案 3 :(得分:0)
我想你可以抓住它而不是使用if:
Integer result = null;
try {
result = var1 + var2;
} catch(NullPointerException ex) {}
好消息是,您不必测试var1或var2的值,默认情况下该值已为空(因此您无需在catch块中设置它)。
答案 4 :(得分:0)
int
和Integer
有自己的属性,用于指定的函数。
int 是一种原始数据类型,不会将其视为对象。即; int中的值只能来自一组预定义的元素。
整数包装在一个对象中,因此它们具有对象的行为。
因此,如果您只想使用算术运算,那就更好了 使用int而不是Integer。
当您使用
Integer
进行算术运算时,它 取消选中Integer
以找到int
值,然后执行操作并将其装箱。所以开销更大,因此这是一种不好的做法。
答案 5 :(得分:0)
从技术上讲,这本身没有if
:
Integer result = var1 == null || var2 == null ? null : var1 + var2;
您可以将其重构为实用方法以供重用:
public static Integer add(Integer var1, Integer var2) {
return var1 == null || var2 == null ? null : var1 + var2;
}