我对Java很新,并且在整数数组中检查null元素时遇到问题。 我正在使用Eclipse进行编辑,并且检查null元素的行显示错误:
抱怨的行:
if(a[i] != null) {
Eclipse的错误消息:
The operator != is undefined for the argument type(s) int, null
在PHP中,这没有任何问题,但在Java中,似乎我必须将数组类型从整数更改为Object以使该行不会抱怨(如下所示)
Object[] a = new Object[3];
所以我的问题是,如果我仍然想要声明为整数数组并且仍然想要检查null, 它的语法是什么?
代码:
public void test() {
int[] a = new int[3];
for(int i=0; i<a.length; i++) {
if(a[i] != null) { //this line complains...
System.out.println('null!');
}
}
}
答案 0 :(得分:22)
在Java中,int
是基本类型,不能是null
。但是,对象存储为引用,因此如果声明对象引用但不生成new
对象,则引用将为null
。
Integers
是ints
周围的对象包装器,意味着它们可以是null
。
public void test() {
Integer[] a = new Integer[3];
for(int i=0; i<a.length; i++) {
if(a[i] != null) { //should now compile
System.out.println('null!');
}
}
}
答案 1 :(得分:7)
int
是基本类型,与引用类型不同。只有引用类型的值为null
。
Integer
vs int
java.lang.Integer
实际上是一种引用类型,是原始类型int
的指定“box”类型。因此,Integer
变量的值可以为null
。
通过在Java中引入自动装箱,可以隐式地完成从int
到Integer
的转换,反之亦然。但请记住,它们是非常不同的类型,实际上尝试取消装箱null
会抛出NullPointerException
。
Integer
作为参考类型的后果已经提到了一个结果:Integer
变量可以具有null
值。另一个是两个==
上的Integer
运算符是引用标识比较,而不是数字相等。
System.out.println(new Integer(0) == new Integer(0)); // prints "false"
只要有可能,您应该更喜欢原始类型到盒装类型。以下是 Effective Java 2nd Edition,第49项:首选原始类型为盒装基元的引用(作者强调):
总之,只要有选择,就可以优先使用原始元素。原始类型更简单,更快捷。如果你必须使用盒装基元,小心! Autoboxing降低了使用盒装基元的详细程度,但没有降低危险性。当你的程序将两个盒装基元与
==
运算符进行比较时,它会进行身份比较,几乎可以肯定不是你想要的。当您的程序执行涉及盒装和未装箱原语的混合类型计算时,它会进行拆箱,而当您的程序取消装箱时,它会抛出NullPointerException
。最后,当您的程序框原始值时,它可能导致代价高昂且不必要的对象创建。
==
对Integer
和int
操作数的行为方式Integer
有一个明显的例外,Integer
必须使用int
:generics。 Java泛型中的类型参数必须是引用类型。所以你不能在Java中拥有List<int>
;您必须改为使用List<Integer>
。
如果您必须拥有允许int[]
值的null
,那么快速回答是使用Integer[]
。由于您现在有一组引用类型,因此某些元素可以是null
。请注意使用引用类型的所有后果,否则您可能会遇到意外情况。
但是,在这一点上,我认真考虑使用List<Integer>
代替(参见 Effective Java 2nd Edition:首选列表到数组)。列表比数组功能更丰富,并且它与更大的Java集合框架可以很好地互操作。
答案 2 :(得分:3)
'int'不能为空。整数(它是一个对象)可以。所以,正如@Justin所说,Integer []将允许你测试null,但是如果int []对你有用,那么你就不需要为null测试了,因为它不会发生。
答案 3 :(得分:1)
int是java中的基本类型,不能为null。只有对象可以为null。
答案 4 :(得分:-1)
你可以使用arr [i]!=&#39; \ 0&#39;像这样。它对我有用。
public class IntNullCheck {
public static void main(String[] args) {
int[] intarr = new int[5];
intarr[0] = 7;
intarr[3] = 9;
for(int n : intarr){
if(n != '\0'){
System.out.println(n);
}else
System.out.println("Null");
}
}
}