这是我的代码:
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;
}
答案 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
,如果需要,应在调用时检查并将其返回值赋值给引用。
修改强>
如果您需要在失败时以编程方式抛出异常(例如data
为current.data
,或者您认为适合上下文的任何标准),您可以用两种“半”方式执行此操作:
答案 2 :(得分:0)
最好不要陷入NullPointerException
被抛出的情况。
只要current
为null
,您的列表中的元素就会耗尽。因此抛出一个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)......但是不要这样做。害怕抓住一个例外,以便抛出更有意义的一个