ArrayList的不同实现

Str*_*kop 2 java openjdk arraylist

我们收到了这个错误

java.lang.NullPointerException
    at java.util.ArrayList.<init>(Unknown Source)
    at de.mystuff.ExtendedArrayList.<init>(ExtendedArrayList.java:38)
Run Code Online (Sandbox Code Playgroud)

其中ExtendedArrayList:38是

new ArrayList(new ArrayCollection<E>(data));
Run Code Online (Sandbox Code Playgroud)

简而言之:ArrayList构造函数有时似乎会阻塞我们自己开发的Collection实现ArrayCollection.

即使使用与我们的客户分发的完全相同的版本,我也无法在我的计算机上重现它.

但我并非100%确定他们正在使用我们所包含的JRE.所以,我搜索了一些ArrayList.java源代码,发现openJDK 6b17有这个

public ArrayList(Collection<? extends E> c) {
    elementData = c.toArray();
    size = elementData.length;
    // c.toArray might (incorrectly) not return Object[] (see 6260652)
    if (elementData.getClass() != Object[].class)
        elementData = Arrays.copyOf(elementData, size, Object[].class);
}
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为如果没有数据我们的ArrayCollection.toArray()返回null.对于我们正在使用的1.5.0_09 Sun JDK/JRE实现,这个构造函数看起来很安全(并且毫无例外地工作).
但openJDK似乎只为unix世界发布.此代码是否也是Windows JRE的一部分?如果是这样,哪个版本?

注意:我知道我们必须修复我们的类,但我想确保我理解NullPointerException的原因.

bma*_*ies 8

为什么你认为返回null而不是返回零长度数组是合法的?

javadoc for List不允许这样做.因此,原因是所有其他JRE都做出了相同的假设.Sun实现在我的Mac上发布的消息来源肯定会做出这样的假设.