比较整数对象与原始int

时间:2018-06-11 18:26:55

标签: java

我将整数对象与原始int进行比较,但如果Integer对象为null

,则会获得空指针异常
public static void main(String[] args) {

        Integer a = null;
        int b = 1;

        if (a != b) {
            System.out.println("True");
        }

    }


Output : Exception in thread "main" java.lang.NullPointerException
    at com.nfdil.loyalty.common.Test.main(Test.java:10)

我得到这个是因为它试图转换null integer object (a.intValue()) into primitive int

还有其他方法可以避免这种情况吗?

4 个答案:

答案 0 :(得分:6)

您可以使用How to concatenate 2 files in SSIS (Integration Services)?

if (!Objects.equals(a, b)) { ... }

答案 1 :(得分:1)

为了能够比较两者,您可以通过将b转换为Integer来避免此异常。

Integer a = null;
int b = 0;
System.out.println(a != (Integer) b);

但这始终会产生true,因为a(Integer) b会将每个评估评估为不同的对象。

原始代码引发异常的原因是JVM尝试将a转换为inta的值为null,但JVM无法将其转换为int。预先将int强制转换为Integer可确保两个比较的术语都是Integer个对象,因此可以正常比较它们,而JVM不必进行任何不安全的隐式转换。

如果要比较两个项目的数值,可以使用如下方法:

Integer a = null;
int b = 0;
System.out.println(!((Integer) b).equals(a));

答案 2 :(得分:1)

您可以先将b转换为Integer,然后与.equals进行比较:

Integer.valueOf(b).equals(a)

答案 3 :(得分:1)

使用if (a != null && a == b)测试对象应该被认为是相等的,或者if (a == null || a != b)来测试对象应该被认为是不相等的。由于bint而不是Integer,因此它不能为空。因此,如果a为空,则无法与b匹配。

虽然可以将b转换为Integer然后使用Object.equals(),但对此类代码的字面解释会要求编译器和运行时执行大量不必要的工作。虽然某些版本的JVM(运行时)可能能够识别出equals的一个参数始终是非空Integer,但它可以因此跳过大量不必要的工作而是生成相当于上面if语句的代码,不能保证所有版本都会这样做(事实上,如果没有某些版本不能,我会非常惊讶)。

顺便提一下,即使a碰巧是b以外的数字基元类型,此方法也会针对b测试int的数值[例如} shortlongdouble]。 bfloat时的行为可能会有点意外[它将ba中的数字进行比较,但float值最接近{{} 1}}],但在使用along时,它会测试精确的数字匹配。相比之下,使用double的方法会报告equals不等于除aint以外的任何类型的任何数字。