java中

时间:2018-05-21 07:02:47

标签: java function nullpointerexception reference

我正在解决问题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);
        }

    }
}`

2 个答案:

答案 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之后为非空。