这是我的问题。在代码中,我创建了一个对象 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);
}
}
答案 0 :(得分:0)
在这里:ob.add(sc.nextInt());
是您在操纵“父”对象,因此没有理由期望在孩子中不会出现null
。从Node
类的定义来看,它不知道存在root
。
P.S .:代码似乎缺少某些部分。例如,我不知道abc()
是什么。
答案 1 :(得分:0)
您之所以得到NullPointerException
是因为您从未调用过add
方法,因此ob.root
是null
。
尝试此代码,它应该可以工作:
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存储null
。 null
不是对象。 null
中的ob
和null
中的temp
之间没有关系。因此,将对节点的引用存储在ob
中时,temp
中的值不会更改。
有关null
,see 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