Як інші відзначили, контракт дозволяє відкинути анулює ...Map
[S] ome реалізації забороняють nullключі та значення [...]. Спроба вставити невідповідний ключ або значення викликає неперевірений виняток, як правило, NullPointerExceptionабо ClassCastException.
... і колекторські фабрики (не лише на картах) цим користуються .
Вони забороняють nullключі та значення. Спроби створити їх за допомогою nullключів або значень призводять до NullPointerException.
Але чому?
Дозвіл nullу колекціях на сьогодні розглядається як помилка дизайну. Це має безліч причин. Хороший варіант - це зручність використання, де найвідоміший виробник проблем Map::get. Якщо він повертається null, незрозуміло, чи відсутній ключ, чи значення було null. Взагалі кажучи, колекції, які гарантовано nullбезкоштовні, простіші у використанні. З точки зору реалізації, вони також вимагають менш спеціального корпусу, що робить код простішим у обслуговуванні та більш продуктивним.
Ви можете послухати, як Стюарт Маркс пояснює це в цій промові, але JEP 269 (той, що запровадив заводські методи) також резюмує це:
Нульові елементи, ключі та значення заборонені. (Жодні нещодавно представлені колекції не підтримують нульових значень.) Крім того, заборона нульових значень пропонує можливості для більш компактного внутрішнього представлення, швидшого доступу та меншої кількості особливих випадків.
Оскільки HashMapце вже було в дикій природі, коли це повільно виявили, було занадто пізно змінювати його, не порушуючи існуючий код, але найновіші реалізації цих інтерфейсів (наприклад ConcurrentHashMap) більше не дозволяють, nullі нові колекції для заводських методів не є винятком.
(Я думав, ще однією причиною було те, що явно використовували null значень розглядалося як ймовірна помилка реалізації, але я це помилився. Це збиралося дублювати ключі, які також є незаконними.)
Отже, заборона nullмала деякі технічні причини, але це також було зроблено для підвищення надійності коду за допомогою створених колекцій.