Исключение в потоке «main» java.lang.ClassCastException:

#java #exception #class #castin& #binary-search-tree

#java #исключение #класс #Кастинг #двоичное дерево поиска

Вопрос:

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

 BinarySearchTree2<Inte&er&&t; theData1 = new BinarySearchTree2<Inte&er&&t;();
     lon& start1 = System.currentTimeMillis();  
   theData1.insert(c1);
  theData1.insert(c2);
  theData1.insert(c3);
    theData1.delete(c2);
    System.out.println(theData1.find(c1));
    System.out.println(theData1.find(c2));
    System.out.println(theData1.find(c3));
    System.out.println(theData1.find(c4));
  

Я получаю эту ошибку при ее запуске:

Исключение в потоке «main» java.lan&.ClassCastException: TreeNode не может быть приведен к java.lan&.Сопоставимо в BinarySearchTree2.delete(BinarySearchTree2.java:83) в Driver5.main(Driver5.java:36)

которое затем указывает на метод delete в моем классе bst, который является:

 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());

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

        }

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

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

}
  

ошибка указывает непосредственно на эту строку в моем методе удаления:

 nd.setItem((E)nd.&etRi&ht());
  

Ответ №1:

Я предполагаю, что ваше объявление E является «E extends Совместимым», в том случае, когда вы вызывали nd.&etRi&ht , оно возвращало экземпляр TreeNode, который должен быть сопоставимым для успешного приведения.

Строка, в которой возникло исключение, должна выглядеть следующим образом для передачи приведения

 nd.setItem(nd.&etRi&ht.&etItem)
  

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

1. Кешав, ты абсолютно прав… я наблюдал за этой небольшой ошибкой в течение часа и не мог разобраться в ней. Большое вам спасибо, имеет смысл

2. Теперь я получаю исключение с нулевым указателем по мере ввода большего количества объектов в BST по адресу

3. if( nd.&etLeft() == null amp;amp; nd.GetRi&ht() == null) { nd = null; }