在另一个方法中初始化对象时出现 NullPointerException

NullPointerException when object is initialized in another method

我正在尝试学习二叉树,NullPointerException马上就要来了。所以我决定写一个小程序来试着理解它。这是代码:

public class Nulls
{
    static Node node;
    private class Node
    {
        int val;
        Node right;
        Node left;
    }
    public void init(Node n)
    {
        if(n==null)n=new Node();
    }
    public void print()
    {
         System.out.println(node);
    }
    public static void main(String[] args)
    {
        Nulls n=new Nulls();
        n.init(node);
        n.print();
    }
}

输出为 null。如果我理解正确的话,节点对象被初始化,输出应该是对象的toString()方法。由于 print() 方法是在 init(Node n) 之后执行的,所以输出不应该是 null。有什么问题?

根本原因是在 Java 中参数是按值传递的,这意味着,当您将(引用)节点 n 作为参数传递时,您实际上是在传递一个副本对该节点的引用,当时是 null。由于您正在更改复制引用,因此实际上没有分配任何内容,并且当 init 完成执行时,您在 init 中创建的新节点有资格进行 GC。

但这很容易解决:

public class Nulls {

    static Node node;

    private class Node {
        int val;
        Node right;
        Node left;
    }

    public void init() {
        if(node==null) {
            node=new Node();
        }
    }

    public void print() {
        System.out.println(node);
    }

    public static void main(String[] args) {
        Nulls n=new Nulls();
        n.init();
        n.print();
    }
}