Java 调用方法时发生调用异常?

Java 调用方法时发生调用异常?,java,Java,以下是我的右BST旋转方法: /** * Performs right rotation on a node * Reset tags redoPreorder, redoInorder, redoPostorder * * @param n */ public void rightRotate(Node<E> n) { Node<E> left = n.getLeft(); Node<E> parent = n.getPare

以下是我的右BST旋转方法:

/**
 * Performs right rotation on a node 
 * Reset tags redoPreorder, redoInorder, redoPostorder 
 * 
 * @param n
 */
public void rightRotate(Node<E> n)
{
    Node<E> left = n.getLeft();
    Node<E> parent = n.getParent();
    left.setParent(parent);
    parent.setLeft(left);
    n.setParent(left);
    if(left.getRight() != null){
        Node<E> right = left.getRight();
        n.setLeft(right);
        //n.setLeft(right);
        right.setParent(n);
        left.setRight(n);
    }
    else{
        left.setRight(n);
    }
    redoInorder = true;
    redoPostorder = true;
    redoPreorder = true;
}
(在下面的树中,“n”是4) 所以我要看一个树结构:

+7
 +4
  +3
   -2
   -
  -6
 +11
  -9
  +18
   +14
    -12
    -17
   +19
    -
    +22
     -20
     -
注意:+表示节点有子节点,-表示它是叶节点。对于 +7 -4 -8 7是树/子树的根,4是左子树,8是右子树(这不是我的示例,只是为了让您知道这个符号是如何工作的)

所以我的问题。。。当我击中

 else{ left.setRight(n); }
在我的rotate方法中,eclipse给了我 调用方法时发生com.sun.jdi.InvocationException

我不明白为什么。我的节点设置程序的所有其他实例都工作正常,这个错误没有给您任何导致问题的提示,因此我想看看是否有比我更有经验的人可以找到一些东西。我只是不明白为什么这会引起问题

谢谢你的帮助

好,这是右旋转测试的故障跟踪,如果有帮助:

java.lang.StackOverflowError
    at java.lang.Integer.toString(Unknown Source)
    at java.lang.String.valueOf(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at edu.iastate.cs228.hw5.BST.recursiveInorderTraversal(BST.java:363)
    at edu.iastate.cs228.hw5.BST.recursiveInorderTraversal(BST.java:359)
    at edu.iastate.cs228.hw5.BST.recursiveInorderTraversal(BST.java:359)
    at edu.iastate.cs228.hw5.BST.recursiveInorderTraversal(BST.java:366)
    at edu.iastate.cs228.hw5.BST.recursiveInorderTraversal(BST.java:359)
    at edu.iastate.cs228.hw5.BST.recursiveInorderTraversal(BST.java:366)
**递归InOrderTraversals将持续一段时间。。。但是你明白要点了,哈哈


我在想toString()有问题吗?它被困在这样的循环中是没有意义的,直到我添加了else{}语句,它才被使用,但我需要它,因为它没有正确地旋转。

你没有共享所有的代码,所以我来猜一猜。如果节点的数据设置为null,那么toString()方法将失败。我相信您的IDE正在引发异常,因为它试图调用toString()来显示调试器中的对象。

您可以共享堆栈跟踪吗?我相信如果您在树中的某个地方有一个循环,您将得到该错误。你在使用Eclipse吗?嗯,这很可能是我的问题。但是,如果一个节点只有一个子节点,另一个子节点为null,但是旋转涉及将其中一个子节点(可能为null)设置为另一个节点。。。hmmmOh wait,没有节点的数据设置为null,只是没有节点用于3的右子节点,因此它是一个null空间。所以我不明白为什么使用集合会导致这种情况。不过可能是类似的问题。setLeft()和setRight()的代码是做什么的?你是空检查吗?否:P。他们所做的只是将正确的节点设置为指定的节点,即使该节点为空,也应该可以工作,它只会将其设置为实际节点。但我相信我发现了问题所在!在else{}语句中,我需要将n的一个子引用设置为null,因为它的父引用仍然是它的子引用。哈哈哈哦,天哪,在那里。。。你创造了一个无意的循环,这是我最初的想法。恭喜!
java.lang.StackOverflowError
    at java.lang.Integer.toString(Unknown Source)
    at java.lang.String.valueOf(Unknown Source)
    at java.lang.StringBuilder.append(Unknown Source)
    at edu.iastate.cs228.hw5.BST.recursiveInorderTraversal(BST.java:363)
    at edu.iastate.cs228.hw5.BST.recursiveInorderTraversal(BST.java:359)
    at edu.iastate.cs228.hw5.BST.recursiveInorderTraversal(BST.java:359)
    at edu.iastate.cs228.hw5.BST.recursiveInorderTraversal(BST.java:366)
    at edu.iastate.cs228.hw5.BST.recursiveInorderTraversal(BST.java:359)
    at edu.iastate.cs228.hw5.BST.recursiveInorderTraversal(BST.java:366)