我正在解决问题Link,逻辑非常简单。但是当我执行代码时,我发现了奇怪的行为。据我所知,如果我将任何对象从main赋予任何方法并且该方法修改了对象,那么main中的对象会在被引用时被修改。但我不知道为什么我的代码中没有发生这种情况,并且总是给出nullpointerexception。以下是我的代码。
import java.util.*;
import java.lang.*;
import java.io.*;
class GFG {
static class Node
{
int val;
Node left,right;
Node(int val)
{
this.val=val;
this.left=null;
this.right=null;
}
}
static int n;
static int[] a;
public static void insert(Node root,int left,int right)
{
int num=right-left+1;
root=new Node(a[left+num/2]);
if(num==1)
return;
insert(root.left,left,left+num/2-1);
insert(root.right,left+num/2+1,right);
}
public static void preorder(Node root)
{
System.out.print(root.val+" ");
if(root.left!=null)
preorder(root.left);
if(root.right!=null)
preorder(root.right);
}
public static void main (String[] args) {
Scanner in=new Scanner(System.in);
int tc=in.nextInt();
while(tc-->0)
{
n=in.nextInt();
a=new int[n];
for(int i=0;i<n;i++)
{
a[i]=in.nextInt();
}
Node root=null;
insert(root,0,n-1);
preorder(root);
}
}
}`
答案 0 :(得分:2)
据我所知,如果我将任何对象从main赋予任何方法并且该方法修改了对象,那么main中的对象会在被引用时被修改
这是真的,但它不是你在代码中所做的。您正在将null
值的变量传递给insert
方法。您的insert
方法不会更改变量引用的对象(并且它不能,因为null
没有引用任何对象),它会为该变量分配一个新值。该新值未传递给main
方法,因此main
方法的root
变量仍为null
。
您的insert
方法必须返回它创建的Node
实例,而您的main
方法应该将该方法返回的值分配给root
变量。
您可以将insert
方法更改为:
public static Node insert(int left,int right)
{
int num=right-left+1;
Node root=new Node(a[left+num/2]);
if(num > 1) {
root.left = insert(left,left+num/2-1);
root.right = insert(left+num/2+1,right);
}
return root;
}
并将其命名为:
Node root = insert(0,n-1);
答案 1 :(得分:2)
您没有将对象传递给insert
,而您正在传递null
,因此无法修改对象。
由于Java没有通过引用传递,因此您无法在其中传递null
root
并期望root
之后为非空。