如何避免Java中算术运算符的NullPointerException?

时间:2013-11-21 09:31:04

标签: java null nullpointerexception operators

鉴于以下内容:

Integer var1 = null;
Integer var2 = 4;
Integer result = var1 + var2; // throws NullPointerException
只要操作数为result

null应为null(同样适用于其他运算符)。我知道我可以使用if语句来做到这一点但是有更聪明的方法吗?

6 个答案:

答案 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)

intInteger有自己的属性,用于指定的函数。

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;
}