我正在审核Java项目并看到以下代码:
List<XYZ> xyzList = new ArrayList<>();
............................
do some things with the list
............................
if (xyzList != null && xyzList.size() > 0) doSomething();
是否存在列表可以为null但大小大于0的情况?或者这是多余的,等同于if (xyzList.size() > 0)
?
编辑:xyzList可以从外部类修改,因此绝对需要进行空检查。感谢您的回复,我度过了漫长的一天,我的思绪无法正常运作。
答案 0 :(得分:11)
代码确保xyzList
在调用size()
之前不为空,这将导致崩溃/异常。
由于短路评估,当size()
为空时,if
子句中不会调用xyzList
答案 1 :(得分:2)
对象必须存在才能取消引用任何内容。这就是使用空值检查得到的结果:我们希望确保{/ 1}}存在之前我们开始对其进行任何操作。
那就是说,根据宣布的地点,这项检查可能是无聊的。
如果您在声明为xyzList
的字段上看到此内容,则可以将该字段视为急切初始化,并且因为它是final
,您可以保证永远不会设置回null。
final
如果你在一个方法中看到这个,并且根本没有变量将它设置为空值,那么null检查是没有意义的,因为它再次 - 它不会改变它的生命周期方法
private final List<XYZ> xyzList = new ArrayList<>(); // guaranteed not null
这种模式是在不保证初始化的变量上完成的。如果您急切地初始化变量或字段,则无需执行此检查。
答案 2 :(得分:1)
如果do some things with the list
不涉及将其设置为null,则空检查是多余的。一个好的IDE会在你打字并发出警告时发现它。
否则,null检查确保大小检查不会产生NullPointerException。
答案 3 :(得分:0)
我不确定是什么
............................
do some things with the list
............................
正在做,但我的猜测是&#34; xyzList!= null&amp;&amp; xyzList.size()&gt; 0&#34;因为你不想最终在空引用上调用方法而被一起调用。因此,它不是多余的
答案 4 :(得分:0)
数组列表不能为NULL&amp; 0同时。
但它并不意味着非空数组列表的大小始终为&gt; 0。 非空的数组列表也可以是0。
示例:
if (workImageArrayList != null) {
Toast.makeText(this, "size : " + workImageArrayList.size(), Toast.LENGTH_SHORT).show();
//can show ---> size : 0, but its not null.
} else {
Log.e("WorkImageArrayList", "" + workImageArrayList);
//arraylist is null.
}
答案 5 :(得分:0)
此行构造一个新的空ArrayList对象,其大小为0,并使xyzList指针指向该对象。
List<XYZ> xyzList = new ArrayList<>();
当xyzList指针未指向任何对象时,它为null。
List<XYZ> xyzList;
因此,ArrayList可以为null或大小为&gt; 0,不是两个