Java 我不知道';我不理解为什么所有的数据都正确地在排列方法中打印,但没有在打印方法中打印

Java 我不知道';我不理解为什么所有的数据都正确地在排列方法中打印,但没有在打印方法中打印,java,binary-search-tree,Java,Binary Search Tree,在树中类中有一个名为arrange()的方法。当我在arrange()方法中打印任何节点值时,该值都是准确的,但是当我在树中使用print()方法时,我会得到一个NullPointerException。请帮忙 public class Node { Node lnode; Node rnode; int data; public Node(String d) { data = Integer.parseInt(d); this.

树中
类中有一个名为
arrange()
的方法。当我在
arrange()
方法中打印任何节点值时,该值都是准确的,但是当我在
树中使用
print()
方法时,我会得到一个
NullPointerException
。请帮忙

public class Node {
    Node lnode;
    Node rnode;
    int data;

    public Node(String d) {
        data = Integer.parseInt(d);
        this.rnode = null;
        this.lnode = null;
    }
}

public class tree {

    public void arrange(String s[], int n, Node r) {
        Node root = new Node(s[0]);
        for (int i = 1; i < n; i++) {
            r = root;
            if (Integer.parseInt(s[i]) > root.data && root.rnode == null) {
                root.rnode = new Node(s[i]);
            } else if (Integer.parseInt(s[i]) < root.data && root.lnode == null)
                root.lnode = new Node(s[i]);

            while (!(r.rnode == null) && (Integer.parseInt(s[i])) > r.data) {

                r = r.rnode;
                if (Integer.parseInt(s[i]) > r.data && r.rnode == null)
                    r.rnode = new Node(s[i]);
                else if (Integer.parseInt(s[i]) < r.data && r.lnode == null)
                    r.lnode = new Node(s[i]);
            }
            while (!(r.lnode == null) && (Integer.parseInt(s[i])) < r.data) {
                r = r.lnode;
                if (Integer.parseInt(s[i]) > r.data && r.rnode == null)
                    r.rnode = new Node(s[i]);
                else if (Integer.parseInt(s[i]) < r.data && r.lnode == null)
                    r.lnode = new Node(s[i]);

            }
        }
        System.out.println(root.rnode.data);
    }

    public void print(Node r) {
        System.out.println(r.rnode.data);
    }

}

变量
root
是对
节点
对象的引用,该对象通过值传递给
arrange
方法。这意味着您对
r
内部
arrange
(也就是说,每次使用
=
操作符)所做的每项分配只会持续到您停留在该方法内的时间

当您的方法返回时,
root
的值将与之前相同,从而在您尝试访问
r.rnode.data
时触发
NullPointerException


既然你知道了这个问题,我建议你试着自己找到解决办法。正如评论所暗示的,这并不难

传递到print方法中的节点r显然是空的。在main方法中没有给出root的值,您在哪里调用
print()
?嗯,看起来像
Node。rdata
null
,那么…相信JVM。如果您相信当它告诉您引用为空时,您会很快解决问题。这是一个使用调试器很容易解决的问题。设置断点并检查调用堆栈。如何在arrange方法之外访问r.rnode.data?我是否应该在赋值时创建一个单独的节点(即每次使用=运算符时)?不清楚您的目标是什么。
arrange
方法是否应该修改
r
参数?在这种情况下,您不能使用赋值,但仍然可以修改
r
成员变量(请参阅)。
排列方法是否应该计算一些东西?然后
返回结果。
Node root;
int n;
System.out.println("Enter the number of elements you want to enter into the bst: ");
Scanner sc = new Scanner(System.in);
n = Integer.parseInt(sc.nextLine());
System.out.println("Enter the elements you want to enter into the bst: ");
Scanner s = new Scanner(System.in);
String st[] = new String[n];
st = s.nextLine().split(" ");
root = new Node(st[0]);
tree t = new tree();
t.arrange(st, n, root);
t.print(root);