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

#java #pointers #null #binary-search-tree

#java #указатели #null #двоичное дерево поиска

Вопрос:

Я использовал драйвер для тестирования одной из своих структур данных (двоичное дерево поиска) и столкнулся с этой проблемой. -Это происходит, когда я вставляю более 2 объектов в bst — Что я пытаюсь сделать: я вставляю 4 объекта в дерево, затем удаляю 2 объекта, а затем распечатываю свой метод find, чтобы он отображал, нашел ли он объекты, которые я запрашиваю. например:

 public class Driver5 {

public static void main(Strin&[] ar&s) {
  Inte&er c1 = new Inte&er(1);
  Inte&er c2 = new Inte&er(2);
  Inte&er c3 = new Inte&er(3);
  Inte&er c4 = new Inte&er(4);
    Inte&er c5 = new Inte&er(5);
    Inte&er c6 = new Inte&er(6);
    Inte&er c7 = new Inte&er(7);
    Inte&er c8 = new Inte&er(8);
    Inte&er c9 = new Inte&er(9);
    Inte&er c10 = new Inte&er(10);
    Inte&er c11 = new Inte&er(11);
    Inte&er c12 = new Inte&er(23);
    Inte&er c13 = new Inte&er(65);
    Inte&er c14 = new Inte&er(45);
    Inte&er c15 = new Inte&er(18);
    Inte&er c16 = new Inte&er(33);
    Inte&er c17 = new Inte&er(54);

  DataStructure1<Inte&er&&t; theData = new DataStructure1<Inte&er&&t;();
    System.out.println("DS1");    
     lon& start = System.currentTimeMillis();  
   theData.insert(c1);
  theData.insert(c2);
  theData.insert(c3);
  theData.insert(c4);
    theData.insert(c5);
    theData.insert(c6);
    theData.insert(c7);
    theData.insert(c8);
    theData.insert(c9);
    theData.insert(c10);
    theData.insert(c11);
    theData.insert(c12);
    theData.insert(c13);
    theData.insert(c14);
    theData.insert(c15);
    theData.insert(c16);
    theData.insert(c17);
    theData.delete(c2);
    theData.delete(c4);
    System.out.println(theData.find(c1));
    System.out.println(theData.find(c2));
    System.out.println(theData.find(c3));
    System.out.println(theData.find(c4));
    theData.delete(c2);
    theData.insert(c3);
    System.out.println(theData.find(c2));
    System.out.println(theData.find(c3));
    System.out.println(theData.find(c4));
    System.out.println(theData.find(c5));
    System.out.println(theData.find(c6));
    System.out.println(theData.find(c7));
    System.out.println(theData.find(c8));
    System.out.println(theData.find(c9));
    System.out.println(theData.find(c10));
    System.out.println(theData.find(c11));
    System.out.println(theData.find(c12));
    System.out.println(theData.find(c13));
    System.out.println(theData.find(c14));
    System.out.println(theData.find(c15));
    System.out.println(theData.find(c16));
    System.out.println(theData.find(c17));

    lon& elapsed = System.currentTimeMillis() - start;
    System.out.println("The time elapsed was: "   elapsed   " ms.");
    System.out.println();

BinarySearchTree<Inte&er&&t; theData1 = new BinarySearchTree<Inte&er&&t;();
     System.out.println("BST");    
    lon& start1 = System.currentTimeMillis();  
   theData1.insert(c1);
  theData1.insert(c2);
  theData1.insert(c3);
  theData1.insert(c4);
    theData1.insert(c5);
    theData1.insert(c6);
    theData1.insert(c7);
    theData1.insert(c8);
    theData1.insert(c9);
    theData1.insert(c10);
    theData1.insert(c11);
    theData1.insert(c12);
    theData1.insert(c13);
    theData1.insert(c14);
    theData1.insert(c15);
    theData1.insert(c16);
    theData1.insert(c17); 
    theData1.delete(c2);
    theData1.delete(c4);
    System.out.println(theData1.find(c1));
    System.out.println(theData1.find(c2));
    System.out.println(theData1.find(c3));
    System.out.println(theData1.find(c4));
    theData1.delete(c2);
    theData1.insert(c3);
    System.out.println(theData1.find(c2));
    System.out.println(theData1.find(c3));
    System.out.println(theData1.find(c4));
    System.out.println(theData1.find(c5));
    System.out.println(theData1.find(c6));
    System.out.println(theData1.find(c7));
    System.out.println(theData1.find(c8));
    System.out.println(theData1.find(c9));
    System.out.println(theData1.find(c10));
    System.out.println(theData1.find(c11));
    System.out.println(theData1.find(c12));
    System.out.println(theData1.find(c13));
    System.out.println(theData1.find(c14));
    System.out.println(theData1.find(c15));
    System.out.println(theData1.find(c16));
    System.out.println(theData1.find(c17)); 

    lon& elapsed1 = System.currentTimeMillis() - start1;
    System.out.println("The time elapsed was: "   elapsed1   " ms.");




}


} 
  

Я получаю ошибку в bst по адресу:

 if( nd.&etLeft() == null amp;amp; nd.&etRi&ht() == null)
        {

            nd = null;
        }
  

полное удаление является:

 public void delete(E item) {

        TreeNode<E&&t; nd = root;

        while(nd != null amp;amp; nd.&etItem().compareTo(item) != 0)
        {
            if(nd.&etItem().compareTo(item) < 0)
                nd = nd.&etRi&ht();

            else
                 nd = nd.&etLeft();
        }

        if( nd.&etLeft() == null amp;amp; nd.&etRi&ht() == null)
        {

            nd = null;
        }

        else if(nd.&etLeft() != null amp;amp; nd.&etRi&ht() == null)

        {
            nd.setItem((E)nd.&etLeft().&etItem());

        }
        else if(nd.&etLeft() == null amp;amp; nd.&etRi&ht() != null)
        {    
            nd.setItem((E)nd.&etRi&ht().&etItem());

        }

        else if(nd.&etLeft() != null amp;amp; nd.&etRi&ht() != null)
        {

            nd.setItem((E)findsucc(nd));
        }    


}
  

Ответ №1:

если nd есть null, , то вы не можете вызвать &etLeft() его. Итак, сделайте свою проверку

 if (nd != null amp;amp; nd.&etLeft() == null amp;amp; nd.&etRi&ht() == null)
  

Просмотрите все причины NullPointerException , чтобы в следующий раз, когда вы столкнетесь с этим, вы знали, что делать немедленно.

Ответ №2:

nd по какой-то причине должно быть null. Проверьте это перед вызовом &etLeft() или &etRi&ht() на нем.

Комментарии:

1. Узнал кое-что новое, что я должен был знать давным-давно, большое спасибо, peeps ценят вашу помощь

2. @user450267 если ответ вас устроил, отметьте его как принятый (отметьте галочкой под счетчиком голосов)