java - 当java必须返回泛型数据类型

时间:2016-07-26 17:28:08

标签: java

这是我的代码:

public E get(int index)
{
    LLNode<E> current = head;
    try {
        for (int i = 0; i <= index; i++) {
            if (current != null) {
                current = current.next;
            }
        }
        return current.data;
    } catch (IndexOutOfBoundsException e) {
        throw e;
    } catch (NullPointerException e) {
        // How do I handle this?
    }
}

当我必须返回E类型的东西时,如何处理NullPointerException?我正在使用JUtil测试我的代码。我是初学者,发现这部分很难理解,请帮助。

编辑:我正在使用JUtil函数测试此函数,其部分代码如下:

// Test empty list, get() should throw an exception
try {
    emptyList.get(0);
    fail("Check out of bounds");
} catch (Exception e) {
}

这里emptylist是一个从个人创建的LinkedList类创建的空列表对象。我如何解决这个问题(//测试空列表,get应该抛出异常),因为在这种情况下,最前面提到的get函数返回NullPointerException?请帮帮我。

新守则:

public E get(int index)
    {
        // TODO: Implement this method.
        LLNode<E> current = head;
        for(int i=0; i<=index; i++)
        {
            if(current != null)
            {
                current = current.next;
            }
            else
            {
                throw new IndexOutOfBoundsException();
            }
        }
        return current.data;
    }

运行“新代码”后,这些是结果,错误位于左下方面板: After running tests on new code

4 个答案:

答案 0 :(得分:4)

您可能希望在此处抛出IndexOutOfBoundsException而不是抓住它。

有一些明确的理由:

  • 您的代码不应该抛出任何NullPointerException个,因为唯一真正发生这种情况的地方是current == null,以及那个&#39}理想情况下,当您想要抛出IndexOutOfBoundsException

在没有try...catch的情况下重写,您的代码看起来像这样:

public E get(int index) {
    // TODO: Implement this method.
    LLNode<E> current = head;
    for (int i = 0; i <= index; i++) {
        if (current != null) {
            current = current.next;
        } else {
            throw new IndexOutOfBoundsException();
        }

    }
    return current.data;
}

答案 1 :(得分:2)

简单,不要处理它。

只有当NullPointerException分配的最后一个值为current时,您的代码才会抛出null,因为您对current != null的检查不包含返回值{{1 }}。

按原样,它不会抛出current.data,尽管可能想要以编程方式抛出它(参见Makoto的回答)。

你应该在那里添加支票。

通常,您不想捕获IndexOutOfBoundsException,而是检查NullPointerException值并采取相应措施。

此外,如果null的最后一个值不是null,但其current属性为,则您的方法可能会返回null,如果需要,应在调用时检查并将其返回值赋值给引用。

修改

如果您需要在失败时以编程方式抛出异常(例如datacurrent.data,或者您认为适合上下文的任何标准),您可以用两种“半”方式执行此操作:

  • 检查过的异常,自定义与否(在这种情况下,您需要声明在方法签名后丢弃它)
  • 运行时异常
  • 围绕已检查异常的运行时异常,因此您不需要声明它

答案 2 :(得分:0)

最好不要陷入NullPointerException被抛出的情况。

只要currentnull,您的列表中的元素就会耗尽。因此抛出一个IndexOutOfBoundsException,因为你的索引实际上超出了列表的范围。

(并且没有必要抓住并重新抛出IndexOutOfBoundsException:只需删除你的try / catch)

答案 3 :(得分:0)

根据事物的外观,你的代码实际上无法生成NullPointerException(唯一可以为null的对象是&#34;当前&#34; - 但是你无效检查) ...所以这个块并没有真正起作用(不确定是否可以命中IndexOutOfBoundsException)。

让我们假装它可以直接回答你的问题 - 可能NullPointer(NPE)块的最有意义的返回值是&#34; null&#34;本身。

catch (NullPointerException e) {
    return null;
} 

逻辑上和设计上这可能没有意义 - 你可能会更好地抛出异常而不是在这里返回一些东西。比方说,例如,&#34; head&#34;是null并且以某种方式导致了NullPointerException - 在这种情况下get(index)抛出NullPointer可能没有意义 - 反而更有意义的是抛出类似IllegalStateException的东西。

catch (NullPointerException npe) {
     // head isn't initialized correctly...it should be
     throw new IllegalStateException("LLNode is not correctly initialized", npe)
}

这个特别的案例最终也是糟糕的设计(检查是否更好......就像你已经在做的那样!......有意识地抓住NUllPOinterException)......但是不要这样做。害怕抓住一个例外,以便抛出更有意义的一个