Добавление нулевого значения в пустой 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