1

我正在阅读以下代码,并遇到了 NSEE。这是什么意思?以下代码块试图演示什么?

public static void objectArrayExamples()
{
Dog[] dogList = new Dog[10];
// How many Dog objects now exist?
dogList[5].bark(5); //uh oh! NSEE
for(int i = 0; i < dogList.length; i++)
{
dogList[i] = new Dog();
}
dogList[3].setName(“Bowzer”);
}
4

6 回答 6

4

从上下文我猜NoSuchElementException,但这不是你在这种情况下会得到的,你实际上会得到一个NullPointerException,因为在 Java 中,一个新的非原始类型数组充满了空值。

于 2012-10-29T16:43:34.160 回答
2

NSEE代表NoSuchElementException,但是这个例子是错误的,你会得到一个NullPointerException

它试图证明的是一个很好的问题,我的猜测是它试图证明初始化数组本身和初始化该数组的元素之间的区别。

教训是它new Dog[10]实际上并没有创建任何Dog对象,所以评论中问题的答案是:没有。new Dog[10]只创建一个空数组,10 个元素长,能够容纳Dog对象。

于 2012-10-29T16:45:22.080 回答
1

可能是NoSuchElementException。你会在你的代码中得到 NullPointerException 因为你从来没有填充过你的数组。

dogList[5].bark(5); //uh oh! NSEE
于 2012-10-29T16:42:50.253 回答
0

你得到 NPE -NullPointerException因为你创建了数组但没有填充它。您的数组仅包含空元素。当您尝试访问元素 #5 的方法时,您会得到 NPE,因为该元素为空。

您必须先初始化元素:

dogList[5] = new Dog();

于 2012-10-29T16:46:03.433 回答
0

由于您只是将数组声明为Dog[] dogList = new Dog[10];,而不是填充数组,因此它应该NullPointerException在检索/使用 ( dogList[5].bark(5);) 时给出异常,说明没有这样的元素。

如果您dogList[5].bark(5);在填充阵列后向下移动,那么您应该很好,例如:

    Dog[] dogList = new Dog[10];
    for(int i = 0; i < dogList.length; i++)
    {
      dogList[i] = new Dog(); //<- Your array is populated here
    }
    dogList[5].bark(5); //<-- Your statement can be moved here
    dogList[3].setName(“Bowzer”);
于 2012-10-29T16:46:22.147 回答
0

NoSuchElementExceptionEnumerationAPI 的一个例外,在您显示的代码中没有任何痕迹。也许该方法bark使用此 API,但从您发布的代码中无法分辨。

当然,如果您显示的是应该发生异常的文字代码,那么您的陈述就是错误的,因为那段代码不可能产生异常,因为没有Dog调用该方法bark的实例。此代码可靠地抛出一个NullPointerException.

于 2012-10-29T16:46:36.373 回答