Java null指针异常取决于or语句的顺序

Java null指针异常取决于or语句的顺序,java,Java,如果数组包含null值或空字符串,则该for循环应该遍历字符串数组并使值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))

如果数组包含null值或空字符串,则该for循环应该遍历字符串数组并使值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;
    }
String[]name={null,“B”,“C”};
布尔hasEmpty=false;

对于(int i=0;i
|
首先检查第一个条件,它将面临一个
null
…在
null
上调用
equals
抛出
NullPointerException

当您首先检查
null
时,第一个条件将计算为
true
,因此它将跳过检查第二个条件

检查以了解java中单运算符和双运算符或/和as逻辑运算符之间的区别

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;
    }
如果OR语句的第一个参数为true,则不需要计算另一个参数


AND语句和false值也是如此。如果第一个为false,则无需计算第二个。

如果语句是惰性计算的,这意味着如果它们知道将失败,则可以退出。第一个语句失败,因为您调用的是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(""))

因为
| |
是一个短路运算符。一旦它从左到右找到一个为真的操作数,它甚至不会计算其他操作数(因为
为真或任何
的操作数始终为真)

&&:如果第一个操作数为false,它会计算其他操作数,因为
false&&anything
总是false。

equals()
方法需要字符串不为
null
,如果值为null,它就不再是一个对象,而实际上调用null.equals。(someOtherObject),然后按预期抛出
NullPointerException

字符串[]名称={null,“B”,“C”};
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;
    }
布尔hasEmpty=false;
对于(int i=0;i性能取决于您有多少个空字符串和空字符串。这可能是您选择先检查空字符串的原因,因为它更经常发生。您也可以这样做,但也应该避免空指针异常。有一个简单的技巧可以做到这一点-依赖您的代码,而不是数据。如果您只需更改比较的内容有了什么和使用你的常数,它就可以正常工作了。你的常数不是空的,因为它们确实存在

if (("".equals(names[i])) || (names[i] == null)){/* Handling empty or null strings */}

看到区别了吗?

另请参见:旁注:避免使用.equals(“”)。只需调用isEmpty()即可。谢谢@Jägermeister