如果数组包含空值或空字符串,则此for循环应该通过String数组并使值hasEmpty为true。以下代码给出了NullPointerException。
String[] names = {null, "B", "C"};
boolean hasEmpty = false;
for(int i = 0; i<names.length; i++){
if ((names[i].equals("")) || (names[i] == null))
hasEmpty = true;
}
但是,如果我在if子句中更改OR语句的顺序,则以下代码似乎有效。有人能告诉我为什么会这样吗?
String[] names = {null, "B", "C"};
boolean hasEmpty = false;
for(int i = 0; i<names.length; i++){
if ((names[i] == null) || (names[i].equals("")))
hasEmpty = true;
}
答案 0 :(得分:3)
因为||
是短路运营商。一旦它找到一个真实的操作数,从左到右,它甚至不会评估其他操作数(因为true or anything
总是为真)。
同样适用于&amp;&amp;:如果第一个操作数为false,它会评估其他操作数,因为false && anything
始终为false。
答案 1 :(得分:0)
正如预期的那样。
如果OR语句的第一个参数为true,则不需要评估另一个。
对于AND语句和false值也是如此。如果第一个是假的,则无需评估第二个。
答案 2 :(得分:0)
if
语句中的代码被懒惰地评估,这意味着如果他们知道他们将会失败,他们就可以退出。第一个失败是因为您正在调用null.equals("")
,这会引发错误。第二个成功是因为您正在检查names[i]
是否为null
,如果是,则退出循环。
if ((names[i] == null ) ||
(names[i].equals(""))) // Don't bother checking if names[i] is null
if ((names[i].equals("")) ||
(names[i] == null)) // Check null only if names[i].equals("") is false
将||
转换为&&
可能会更有意义:
if (names[i] != null && !names.equals(""))
答案 3 :(得分:0)
String[] names = {null, "B", "C"};
boolean hasEmpty = false;
for(int i = 0; i<names.length; i++){
/* change here */
if (("".equals(names[i])) || (names[i] == null))
hasEmpty = true;
}
原因: 您正在尝试将 null 值与 empty 字符串进行比较,因此在第一个代码段中您将获得NullPointerException。但在第二个代码中,你改变了两个条件的位置。 OR条件的评估如下:
如果满足第一个条件,则仅检查下一个部分。
表示 if(a || b)
如果a为真,则不会评估b。 但如果a为假,那么b将被评估。