在以下代码中,LinkedList
是一个用于创建显式链接列表的类,其方法为insertFirst(..)
和displayList()
。
我试图使用这个类在另一个类中创建一个变量 - > FCFS类。在类FCFS中将其声明为私有变量会导致在行process.insertFirst(..)
和process.display()
处出现NullPointerException错误。当我在work()
方法中声明它时,它工作得很好。
我只是想明白为什么会这样:
public class FCFS {
public void work(){
LinkedList process = new LinkedList();
process.insertFirst(3);
process.displayList();
}
}
虽然没有:
public class FCFS {
private LinkedList process;
public void work(){
process.insertFirst(3);
process.displayList();
}
}
答案 0 :(得分:3)
在第二个代码示例中,您没有像第一个代码示例中那样初始化process
。因此,Java会根据JLS 4.12.5自动将其初始化为null
。使用:
private LinkedList process = new LinkedList();
或者您可以使用构造函数:
public FCFS() {
process = new LinkedList();
}
答案 1 :(得分:3)
在第二个版本中,您永远不会初始化process
,因此它的默认值为null。当您取消引用它时,您将获得NullPointerException
。
如果您在本地变量版本中初始化process
到null
,您将得到完全相同的问题...并且如果您将process
初始化为非空值实例字段版本,它将工作。现在还不能立即明确 它应该被初始化 - 这将取决于该类其余部分的设计。
如果你根本没有初始化局部变量,你会得到一个编译时错误:当 fields 有默认值(0,null,false等)时,局部变量不会t - 编译器确保您不从非明确分配的变量中读取。
请注意,如果你只需要需要一个变量在一个方法的持续时间内有效 - 如果它在逻辑上不是该类状态的一部分 - 那么它最好是一个本地变量无论如何。
另请注意,Java已经附带了(通用)LinkedList
类型。我希望这段代码仅用于学术目的:)
答案 2 :(得分:3)
当您在方法中声明它时,您还要指定一个非空值
LinkedList process = new LinkedList();
在类中,java编译器使用null值初始化流程变量,从而初始化NPE。要解决您需要将私有变量声明为
private LinkedList process = new LinkedList();
答案 3 :(得分:1)
你面临什么样的错误 它是一个空指针异常吗? 尝试初始化链表1
private LinkedList process = new LinkedList();
答案 4 :(得分:1)
在第二个中你没有初始化LinkedList(而在你做的第一个中)。你应该这样做:
public class FCFS {
private LinkedList process = new LinkedList();
public void work(){
process.insertFirst(3);
process.displayList();
}
}
或者这(我通常更喜欢这个):
public class FCFS {
private LinkedList process;
public FCFS(){
this.process = new LinkedList();
}
....(work method)
}
在执行FCFS的代码中,work()初始化FCFS:
FCFS myFCFS = new FCFS();
myFCFS.work();