Согласно документации API J2SE 5.0 :
ArrayList public
ArrayList (Коллекция c)
Создает список, содержащий
элементы указанной коллекции,
в порядке их возврата
итератор коллекции. ArrayList
Экземпляр имеет начальную емкость
110% размер указан
коллекция.
Параметры: c - коллекция, чья
элементы должны быть помещены в это
список.
Броски:
NullPointerException - если указанная коллекция пуста.
Итак
new ArrayList(new ArrayCollection<E>(data));
бросает NullPointerException
, если new ArrayCollection<E>(data)
равно нулю.
Редактировать:
140 /**
141 * Constructs a list containing the elements of the specified
142 * collection, in the order they are returned by the collection's
143 * iterator.
144 *
145 * @param c the collection whose elements are to be placed into this list
146 * @throws NullPointerException if the specified collection is null
147 */
148 public ArrayList(Collection<? extends E> c) {
149 elementData = c.toArray();
150 size = elementData.length;
151 // c.toArray might (incorrectly) not return Object[] (see 6260652)
152 if (elementData.getClass() != Object[].class)
153 elementData = Arrays.copyOf(elementData, size, Object[].class);
154 }
OpenJDK содержит эти строки в конструкторе ArrayList. Согласно документации этого конструктора:
146 * @throws NullPointerException, если указанная коллекция пуста
Он должен выдавать исключение, только если коллекция равна нулю.
Вот эти строки:
149 elementData = c.toArray();
150 size = elementData.length;
Collection.toArray().length
метод вызывается.
В вашей реализации Collection.toArray()
имеет значение null, поэтому он генерирует исключение NullPointerException.
Согласно документации J2SE Collection.toArray
toArray Object [] toArray () Возвращает
массив, содержащий все элементы
в этой коллекции. Если коллекция
дает какие-либо гарантии относительно того, какой заказ
его элементы возвращаются его
итератор, этот метод должен возвращать
элементы в том же порядке.
Возвращенный массив будет "безопасным" в
что нет ссылок на это
поддерживается этой коллекцией. (В
другими словами, этот метод должен выделить
новый массив, даже если эта коллекция
поддерживается массивом). Звонящий
Таким образом, свободно изменять возвращаемый
массив.
Этот метод действует как мост между
API на основе массива и коллекции.
Возвращает: массив, содержащий все
элементы в этой коллекции
Так что он не должен возвращать ноль. Он должен вернуть пустой массив. Таким образом, .length вернет 0 и проблем не будет.