【问题标题】:indexOf null exceptionindexOf 空异常
【发布时间】:2014-04-26 16:49:44
【问题描述】:
public int indexOf(X item)
{
    Node <X> current = head;
    int c = 0;
    if (current.getValue().equals(item))
    {
        return c;
    }
    while (current != null)
    {
        current = current.getLink();
        c++;
        if (current.getValue().equals(item))
        {
            return c;
        }
    }
    return -1;
}

.

@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"));
}

由于某种原因,最后一个断言作为 Nullpointer 异常引发了错误。但是我做到了,所以当它确实达到 null 时返回 -1,这是我在测试的第三个断言中试图返回的,我在这里缺少什么?

【问题讨论】:

  • 查看异常中的行号了吗?您对堆栈跟踪的哪一部分感到困惑(假设您这样做了,否则您不会在这里发布)?

标签: java arrays list hyperlink


【解决方案1】:

问题是这样的:

while (current != null)
{
    current = current.getLink();

您确保 current 不是 null 。 . .但随后您立即更改current,使其有可能再次成为null。只要item 不在您的链接列表中,您就会遇到这种情况。

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

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 isnt null 移动到下一个链接,如果那不是 null 要么做同样的事情,直到你到达项目。如果不存在则抛出 -1
  • 你测试current是否为非空;然后,您将current 设置为current.getLink(),这可能为空;然后,你尝试调用current.getValue()——但如果current 为空,你就不能这样做。这有意义吗?
【解决方案2】:
while (current != null)
{
    current = current.getLink();
    c++;
    if (current.getValue().equals(item))
    {
        return c;
    }
}
return -1;

在您的空检查之后,您正在前进到下一个链接。 current.getLink 正在返回 null。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多