在另一个方法中初始化对象时出现 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();
}
}
我正在尝试学习二叉树,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();
}
}