我将整数对象与原始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
。
还有其他方法可以避免这种情况吗?
答案 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
转换为int
。 a
的值为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)
来测试对象应该被认为是不相等的。由于b
是int
而不是Integer
,因此它不能为空。因此,如果a
为空,则无法与b
匹配。
虽然可以将b
转换为Integer
然后使用Object.equals()
,但对此类代码的字面解释会要求编译器和运行时执行大量不必要的工作。虽然某些版本的JVM(运行时)可能能够识别出equals
的一个参数始终是非空Integer
,但它可以因此跳过大量不必要的工作而是生成相当于上面if
语句的代码,不能保证所有版本都会这样做(事实上,如果没有某些版本不能,我会非常惊讶)。
顺便提一下,即使a
碰巧是b
以外的数字基元类型,此方法也会针对b
测试int
的数值[例如} short
,long
或double
]。 b
为float
时的行为可能会有点意外[它将b
与a
中的数字进行比较,但float
值最接近{{} 1}}],但在使用a
或long
时,它会测试精确的数字匹配。相比之下,使用double
的方法会报告equals
不等于除a
或int
以外的任何类型的任何数字。