indexOf 可以找到 null

indexOf can find null

这是我对 indexOf 方法的实现(自定义数组列表 class)

public int indexOf(String string) {
    for(int i = 0; i < size; i++) {
        if(strings[i].equalsIgnoreCase(string)){
            return i;
        }   
    }
    return -1;
}

这是应该 return 为 null 的代码,但实际上没有。我不明白为什么

public void indexOf_can_find_null() {
     StringArrayList lst = list("1", "2", null, "3", "4", "3", "2", "1");
     assertEquals(2, lst.indexOf(null));
}

因为NullPointerException。当i=2时,strings[i]null,那么strings[i].equalsIgnoreCase(string)会抛出一个NullPointerException.

PS: 没有list()的代码,这只是胡乱猜测

这永远行不通。您不能使用 equalsIgnoreCase() 来测试 null.

equalsIgnoreCase() 方法对字符串的 VALUES 进行比较。空字符串没有值。当您使用 null 时,您是在说此 String 对象未引用任何内容,因此它没有任何值,因此任何具有值的对象都不能等于它。如果您在调用 equalsIgnoreCase() 之前有一个空对象,则会抛出 NullReferenceException,因此它在任何一个方向都不起作用。

如果您使用 == 运算符,它将允许您测试字符串的引用,null 可以解决这个问题,但是这不能用于字符串比较。如果你真的想让它起作用,你需要结合这些方法:

if(strings[i] != null && strings[i].equalsIgnoreCase(string))
    return i;
else if(strings[i] == null && string == null)
    return i;

在你的例子中,当 i = 2 时,你将有:

string[2].equalsIgnoreCase(string) evaluates to null.equalsIgnoreCase(string)

这将抛出空指针异常,因为使用了空引用。