空指针异常和对象

时间:2019-03-23 08:36:05

标签: java object nodes

这是我的问题。在代码中,我创建了一个对象 ob ,并创建了一个临时节点,只是将其指向根节点。因此,当我打印数据(对于温度) ,正如我期望的那样,我得到了NullPointerException。但是在我将数据分配给根节点之后, 这次我再次为临时节点打印数据,我期望输出的内容与根节点的数据相同,但是我再次得到NullPointerException。

为什么会这样?临时节点不是仅在指向(是!是!在Java中没有指针)。

这是代码

 abc ob=new abc();
    Node temp=ob.root;
    try {
        System.out.println(temp.data);
    }
    catch (NullPointerException ex)
    {
        System.out.println("Null");
    }
    while(sc.hasNextInt())
        ob.add(sc.nextInt());   //add method is used to add elements in linked list
    System.out.println(temp.data);

这是节点类。

 class Node
{
    int data;
    Node next;
    Node(int data)
    {
        this.data=data;
        this.next=null;
    }
}

随时询问您是否不了解我的代码 而且,请原谅我的英语。

完整代码

    import java.util.Scanner;

class abc
{
    class Node
    {
        int data;
        Node next;
        Node(int data)
        {
            this.data=data;
            this.next=null;
        }
    }
    Node root=null;

    void add(int data)
    {
        Node new_node=new Node(data);
        if(root==null)
            root=new_node;
        else
        {
            new_node.next=root;
            root=new_node;
        }
    }

    public static void main(String ar[])
    {
        Scanner sc=new Scanner(System.in);
        abc ob=new abc();
        Node temp=ob.root;
        try {
            System.out.println(temp.data);
        }
        catch (NullPointerException ex)
        {
            System.out.println("Null");
        }
        while(sc.hasNextInt())
            ob.add(sc.nextInt());   //add method is used to add elements in linked list
        //System.out.println(temp.data);

    }

} 

4 个答案:

答案 0 :(得分:0)

在这里:ob.add(sc.nextInt());是您在操纵“父”对象,因此没有理由期望在孩子中不会出现null。从Node类的定义来看,它不知道存在root

P.S .:代码似乎缺少某些部分。例如,我不知道abc()是什么。

答案 1 :(得分:0)

您之所以得到NullPointerException是因为您从未调用过add方法,因此ob.rootnull

尝试此代码,它应该可以工作:

 public static void main(String ar[])
    {
        Scanner sc=new Scanner(System.in);
        abc ob=new abc();
        System.out.print("Enter an integer followed by <enter>: ");
        ob.add(sc.readInt());
        Node temp=ob.root;
        try {
            System.out.println(temp.data);
        }
        catch (NullPointerException ex)
        {
            System.out.println("Null");
        }
        while(sc.hasNextInt())
            ob.add(sc.nextInt());   //add method is used to add elements in linked list
        //System.out.println(temp.data);

    } 

PS:请注意,根据 Java命名约定,类名应始终以大写字母开头。

答案 2 :(得分:0)

变量temp存储nullnull不是对象。 null中的obnull中的temp之间没有关系。因此,将对节点的引用存储在ob中时,temp中的值不会更改。

有关nullsee this的更多信息。

您可以在根目录中存储一个空节点。在catch块中初始化root并在temp中存储相同的引用。 (您也可以为一个空节点声明一个构造函数)

ob.root = ob.new Node(0);
temp = ob.root;

在add()方法中,检查root是否具有值,如果root为空,则将值添加到root的数据字段中。

void add(int data) {
    if (root.data == 0)
        root.data = data;
    else {
        Node new_node = new Node(data);
        new_node.next = root;
        root = new_node;
    }
}

答案 3 :(得分:0)

这是怎么回事

public static void main(String ar[])
{
    Scanner sc=new Scanner(System.in);
    abc ob=new abc();
    // the value for root (Node object) for the ob object is null, as you declared in your class

    Node temp=ob.root;
    // You have assigned the null value to the temp reference
    // equivalent to saying Node temp = null;
    try {
        System.out.println(temp.data);
        // This doesnt have anything to refer to so throws the exception
    }
    catch (NullPointerException ex)
    {
        System.out.println("Null");
    }
    while(sc.hasNextInt())
        ob.add(sc.nextInt());   //add method is used to add elements in linked list
    //System.out.println(temp.data);

}

*********************。更改为此,您将获得温度中的最后一个节点**************

public static void main(String ar[])
{
    Scanner sc=new Scanner(System.in);
    abc ob=new abc();
    // the root value for the ob object is null, as you declared in your class
    while(sc.hasNextInt())
        ob.add(sc.nextInt());   
    // Once you have completd the node entries, the last node is what object ob will hold.
    // and the value will be the root node value

    Node temp=ob.root;

    try {
        System.out.println(temp.data);

    }
    catch (NullPointerException ex)
    {
        System.out.println("Null");
    }


}

*******************显示初始化的区别**********

class abc
{
class Node
{
    int data;
    Node next;
    Node(int data)
    {
        this.data=data;
        this.next=null;
    }
}
Node root=new Node(0);
Node root2 = null;

void add(int data)
{
    Node new_node=new Node(data);
    if(root==null)
        root=new_node;
    else
    {
        new_node.next=root;
        root=new_node;
    }
}

public static void main(String ar[])
{
    Scanner sc=new Scanner(System.in);
    abc ob=new abc();
    // the root value for the ob object is null, as you declared in your class
    //while(sc.hasNextInt())
    //  ob.add(sc.nextInt());   
    // Once you have completd the node entries, the last node is what object ob will hold.
    // and the value will be the root node value

    Node temp=ob.root;

    try {
        System.out.println(temp.data);
        System.out.println(ob.root);
        System.out.println(ob.root2);

    }
    catch (NullPointerException ex)
    {
        System.out.println("Null");
    }


}

}

******输出将为****

0
nodeSoulutin.abc$Node@6b71769e
null