ArrayList<String> list1=new ArrayList<String>();
list1=object.getsomeFiles();
getsomeFiles()
包含一些代码,如果存在则返回文件名或返回null
我检查了
if(list1!=null&&!list1.isEmpty())
但仍然会引发NullPointerException
。
当我进行调试时,我发现list1保持null
值。
答案 0 :(得分:3)
&
会破坏Short-circuit evaluation,而是使用&&
。
<强>解释强>:
如果你有:
if(a() & b())
然后 a
和b
将被执行,最终结果将被评估。
但如果你有:
if(a() && b())
如果a()
为false
,则b()
将不会。
答案 1 :(得分:2)
“object”实例为null。
ArrayList<String> list1=new ArrayList<String>();
if(Object!=null){
list1=object.getsomeFiles();
if(list1!=null&&!list1.isEmpty()){
// Your code here
}
}
答案 2 :(得分:1)
将if(list1!=null&!list1.isEmpty())
更改为if(list1!=null&&!list1.isEmpty())
short-circuit(like &&)
,如果没有必要,请不评估右侧。作为一个例子,如果&amp;&amp;左手边是假的,没有必要评估右手边的一面。换句话说||如果左边是真的,则无需评估右手边的一个。因此,如果list
为null
,则部分的其余部分将无法评估。
non-short(like &)
总是评估双方。所以你会得到NullPointerException
。
答案 3 :(得分:1)
问题是,如果您使用&
检查两个条件,则无论第一个语句是true
还是false
,都会评估这两个语句。如果第一个是false
,则评估第二个结果为NullPointerException
。要解决这个问题,您应该是&&
运营商。它仅在第一个表达式为真时评估第二个表达式,仅当list1
不是null
时才会计算。
因此,if里面的正确条件应该是
list1 != null && !list1.isEmpty()
答案 4 :(得分:1)
正如其他人所回答的那样,将&
更改为&&
。
问题是由于&
和&&
之间存在差异。
例如
if (A==B && B==C)
首先jvm评估A == B,如果错误退出,则为
if (A==B & B==C)
第一个JVM评估A==B
如果false或者真的JVM也评估B==C
这是一个名为“short-circuited”的
的Java规范答案 5 :(得分:0)
在&
条件
&&
替换为双if
这个
if(list1!=null&!list1.isEmpty())
应该是
if(list1!=null && !list1.isEmpty())
&&
是合乎逻辑的,即真实&amp;&amp;是真的,其他一切都是假的。
而&
是按位和。
答案 6 :(得分:0)
使用&&
代替&
if(list1!=null && !list1.isEmpty())
答案 7 :(得分:0)
所有答案都很好地解释了&
和&&
。
但是,在您修改后仍然会收到NullPointerException
,那么问题就是您要调用object
方法的 null
getsomeFiles()
。
list1=object.getsomeFiles();
↑ //null
如果你有
代码SomeFileClass object; //here object is null
确保object
初始化为:
object = new SomeFileClass();
或在对象创建时初始化
SomeFileClass object = new SomeFileClass();
来自Java docs NullPointerException
当应用程序在需要对象的情况下尝试使用null
时抛出。其中包括:
Throwable
值一样。