Исключение нулевого указателя в рекурсивном методе

Я пытаюсь создать метод «headSet», который создает и возвращает новые TreeSet, set значений, которые являются всеми значениями в вызываемом TreeSet, которые меньше, чем элемент параметра «до».

Я могу получить все правильные обходы, и я отлаживал в Net Beans, новый набор действительно содержит все значения, которые он должен иметь до того, как будет выдано исключение. Я просто не могу понять, почему, когда я звоню headSet(n.right,before,set) .. конкретно n.right .. он ломается. Все бы работало, если бы не сломалось.

Редактировать: когда я запускаю программу с проблемной строкой headSet(n.right,before,set), все 3 вызова метода headSet() в основном рекурсивном помощнике находятся в трассировке стека. Когда я закомментирую эту строку, не возникает никаких проблем, кроме неправильного обхода дерева.

Это основной общедоступный вызываемый метод, который запускает рекурсивный помощник:

public SortedSet<E> headSet(E before){
  SortedSet<E> set = new SearchTreeSet<E>();
  headSet(root, before, set);
  return set;
}

где корень — это первый узел в вызываемом TreeSet.

Основной рекурсивный помощник:

private void headSet(Node n, E before, SortedSet<E> set) {
  int comp = myCompare(n.data, before);

  if (comp < 0){ //n.data is less than before
    // add node n to the new set
    if (n.data != null) { //It shouldn't be null but I just wanted to eliminate NPE sources
        set.add(n.data);
    }
    // all nodes to the left are added automatically with a separate recursive function
    headSet(n.left, set);

    // test nodes to the right

    //////////////The next statement forces a null pointer exception ////////
    headSet(n.right, before, set);
  }
  // n.data is greater than or equal to 'before'
  else {

        // move to the left and retest
        headSet(n.left, before, set);
  }
}

Вторая рекурсивная функция не сравнивает, она просто добавляет все ветви узла в новый «набор» отсортированного дерева.

private void headSet(Node n, SortedSet<E> set){
  if (n.data != null){ // 'if statement' is to eliminate NPE sources, it normally shouldn't be null
    set.add(n.data);
  }
  if (n.left != null) { headSet(n.left, set);  }
  if (n.right != null) { headSet(n.right, set); }
}

РЕШЕНО : Спасибо, ребята! Это сделало это.. Я не могу поверить, что не видел этого.

Вот что я изменил, чтобы решить проблему:

if (n.left != null) {
   headSet(n.left, set);
}

if (n.right != null) {
   headSet(n.right, before, set);
}

А также

if (n.right != null) {
   headSet(n.right, before, set);
}

person user2905205    schedule 22.10.2013    source источник
comment
вы получаете NullPointerException в обоих случаях?   -  person Sumit Gupta    schedule 22.10.2013
comment
Отладить и посмотреть, что на самом деле пусто? Кроме того, может помочь фактическая трассировка стека.   -  person Taylor    schedule 22.10.2013
comment
Вероятно, вы находитесь в последнем узле, у которого нет ничего большего. Проверьте наличие n.right!=null в вашем headSet(n.right,before,set)   -  person Keerthivasan    schedule 22.10.2013
comment
это не вызовет NPE. headSet(n.right,before,set) вызовет NPE, только если n равно нулю   -  person Taylor    schedule 22.10.2013


Ответы (1)


Прежде всего, я не думаю, что вы добьетесь того, что запланировали с SortedSet. Потому что, когда вы добавляете объект в SortedSet, он сортирует внутренний порядок объектов в соответствии с методом compareTo, определенным объектом, который вы к нему добавляете. Теперь в вашем случае проще всего реализовать класс Comparable to n.data. Когда вы это сделаете, вы можете использовать логику, которую вы определили в методе myCompare. Теперь добавьте n.data в SortedSet в любом порядке, и SortedSet упорядочит их в своем естественном порядке. Если вы действительно хотите поддерживать порядок программно, используйте List. Теперь предположим, что вы избавились от NPE, а затем хотите распечатать n.data, хранящиеся в Set, и хотите проверить, сработал ли ваш алгоритм сортировки, чего вы не можете сделать, потому что set вернет список объектов в соответствии с его естественным порядок сортировки.

person user2880879    schedule 22.10.2013