例如,给定java中的数组:nums
当我们证明nums
是否为空时,我们需要做 -
if(nums == null || nums.length == 0)
而不仅仅是
if(nums.length == 0)
为什么?
答案 0 :(得分:2)
您需要确保首先未定义nums
,否则尝试从未定义或空对象引用属性将导致NullPointerException
。
此外,每个代码片段完成两个完全不同的事情和你的情况,或者足以指示你不应该对数组“做某事”:
nums == null // This checks if your array exists
nums.length == 0 // This checks if your array has no elements
答案 1 :(得分:0)
考虑这组方法:
public void breakEverything() {
MyClass[] bob;
// pass a null object to iterateArray
iterateArray(bob);
}
public void dontBreakStuff() {
MyClass[] bob = new MyClass[0];
// pass an array of length 0 to iterateArray
iterateArray(bob);
}
public void iterateArray(int[] arr) {
for (int i == 0; i < arr.length; i++) {
doSomethingWith(arr[i]);
}
}
实际上有几件事情在这里发生:
对于breakEverything()
方法 - 您将空引用传递给iterateArray()
方法。这就是参数arr
为null,因此调用任何方法或访问该参数上的任何变量都将引发NPE。您可以通过包含支票来防止这种情况:
if (arr == null) {
return;
}
但是你的问题还存在第二个问题:
当我们证明nums是否为空时,我们需要做if(nums == null || nums.length == 0)而不仅仅是(nums.length == 0)
这里的问题是MyClass[].length()
返回分配的数组的容量,它实际上没有返回你放在数组中的元素数量 - 就是它不计算非零指数的数量。您可能会想到ArrayList.size()
- 它实际上计算了List中元素的数量,而不是分配的空间(这是因为ArrayList的大小可以增大和缩小,而原始数组则不能)。
答案 2 :(得分:0)
如果数组没有用数据初始化,即
int[] nums=null;
if(nums.length==0){}
为您提供 NullPointerException - 因为您尝试访问不存在的信息
如果您声明但未初始化数组nums
int[] nums ;
if(nums==null || nums.length==0){}
为您提供编译错误 - 因为您尚未初始化并尝试访问它
简而言之nums==null
是 null check