Java indexOf null异常 public int indexOf(X项) { 节点电流=头; int c=0; if(current.getValue().equals(item)) { 返回c; } while(当前!=null) { current=current.getLink(); C++; if(current.getValue().equals(item)) { 返回c; } } 返回-1; }

Java indexOf null异常 public int indexOf(X项) { 节点电流=头; int c=0; if(current.getValue().equals(item)) { 返回c; } while(当前!=null) { current=current.getLink(); C++; if(current.getValue().equals(item)) { 返回c; } } 返回-1; },java,arrays,list,hyperlink,Java,Arrays,List,Hyperlink,@测试 公共无效测试索引 { LList b=新的LList(); 对于(int i=0;i

@测试
公共无效测试索引
{
LList b=新的LList();
对于(int i=0;i<20;i++)
b、 加上(“str”+i);
资产质量(19,b.indexOf(“str0”);
资产质量(0,b.indexOf(“str19”);
资产质量(-1,b.indexOf(“未找到”);
}
出于某种原因,最后一个断言将错误作为Nullpointer异常。但是当它返回-1时达到null时,我就这样做了,这是我在测试的第三个断言中试图返回的,我在这里遗漏了什么?

问题是:

@Test
public void testIndexOf()
{
    LList<String> b = new LList<String>();

    for (int i = 0; i < 20; i++)
        b.add("str" + i);

    assertEquals(19, b.indexOf("str0"));
    assertEquals(0, b.indexOf("str19"));
    assertEquals(-1, b.indexOf("not found"));
}
确保
当前
不是
。但是,您可以立即更改当前的
current
,使其再次成为
null
。只要链接列表中没有
,您就会遇到这种情况

您可以通过稍微重新排列代码来解决此问题:

while (current != null)
{
    current = current.getLink();
public int indexOf(X项)
{
节点电流=头;
int c=0;
while(当前!=null)
{
if(current.getValue().equals(item))
{
返回c;
}
current=current.getLink();
C++;
}
返回-1;
}

空检查后,您将前进到下一个链接
current.getLink
返回空值。

是的,这是有效的,但这与我写的有什么不同,我仍然不理解。我在当前不为空时移动到下一个链接,如果该链接不为空,请执行相同操作,直到到达项目。或者抛出-1,如果它不在那里,则测试
current
是否非空;然后,将
current
设置为
current.getLink()
,该值可能为空;然后,尝试调用
current.getValue()
——但如果
current
为空,则无法执行此操作。这有意义吗?你看过例外中的行号了吗?您发现堆栈跟踪的哪一部分令人困惑(假设您困惑了,否则您不会在这里发布)?
while (current != null)
{
    current = current.getLink();
public int indexOf(X item)
{
    Node <X> current = head;
    int c = 0;
    while (current != null)
    {
        if (current.getValue().equals(item))
        {
            return c;
        }
        current = current.getLink();
        c++;
    }
    return -1;
}
while (current != null)
{
    current = current.getLink();
    c++;
    if (current.getValue().equals(item))
    {
        return c;
    }
}
return -1;