Добавление нулевого значения в пустой TreeSet, генерирующий NullPointerException

import java.util.TreeSet;
class Test 
{
    public static void main(String[] args) 
    {
        TreeSet t=new TreeSet();
        t.add(null);
        System.out.println(t);
    }
}

вывод: NullPointerException. Я прочитал во многих статьях, что пустой TreeSet будет принимать значение null в первый раз, но я получаю NullPointerException... я использую java7..может ли какое-либо тело прояснить мои сомнения....

Ответ 1

Документация для TreeSet # add в Java 7 гласит:

NullPointerException - если указанный элемент имеет значение null, и этот набор использует естественный порядок, или его компаратор не допускает нулевые элементы

Итак, поскольку вы не указали пользовательскую реализацию компаратора, которая может обрабатывать нулевые значения, вы получаете NPE.

Изменить: в Java 6 был добавлен элемент null в качестве первого элемента TreeSet/TreeMap, но он считался bug:

Ответ 2

Это потому, что для пустого TreeSet в первом элементе может быть вставлено нулевое значение, но после вставки этого первого значения, если мы пытаемся вставить любые другие объекты, мы получим NullPointerException.

Для непустого TreeSet, если мы пытаемся вставить нулевое значение во время выполнения, вы получите NullPointerException. Это связано с тем, что, когда некоторые элементы существуют в дереве, перед вставкой любого объекта он сравнивает новый объект с существующими с помощью метода compareTo() и решает, куда поместить новый объект. Поэтому, вставив нуль, метод compareTo() внутренне выбрасывает NullPointerException.

Я думаю, что в новой версии Java пустая вставка не разрешена.

Ответ 3

Объяснение API:

Сводка: вставка недопустимого элемента в TreeMap Выбрасывает NPE Описание. Из-за ошибки в java.util.TreeMap ранее было возможно вставить недопустимые нулевые элементы и элементы, не реализующие интерфейс Comparable, в пустой TreeMap или TreeSet. Только один недопустимый элемент можно вставить в пустой TreeMap или TreeSet; дополнительные элементы будут вызывать ожидаемое исключение NullPointerException или ClassCastException. Большинство других операций над сборником также потерпят неудачу. Начиная с Java SE 7, вставка недопустимого нулевого элемента или элемента, не реализующего Comparable в пустой TreeMap или TreeSet, выдает исключение NullPointerException.

Ответ 4

Начиная с 1.7, значение null не принимается TreeSet. Если вы принудительно добавите, мы получим NullPointerException. До 1.6 null принимался только как первый элемент.

Ответ 5

TreeSet внутренне использует Comparable интерфейс для сортировки элементов в порядке возрастания. Метод CompareTo() интерфейса Comparable сравнивает два значения друг с другом, чтобы найти большее значение. Если при добавлении пустого элемента в качестве элемента нельзя сравнивать нулевое значение с другим значением, чтобы определить, какое из них является большим или большим значением, по этой причине метод compareTo() выбрасывает исключение NullPointerException.

Объявление метода добавления в TreeSet:

public boolean add(E e) throws ClassCastException, NullPointerException;

Ответ 6

Для Пустого TreeSet в качестве 1-го элемента возможна нулевая вставка. Но после вставки этого нулевого значения, если мы пытаемся вставить какой-либо элемент, мы получим исключение NullPointerException. И для Пустого TreeSet, если мы пытаемся Вставить нуль, мы получим NullPointerException