0

在下面的代码中,LinkedList是一个用于创建-显然-链接列表的类,它具有方法insertFirst(..)and displayList()

我试图使用这个类在另一个类中创建一个变量——> FCFS 类。在 FCFS 类中将其声明为私有变量会导致在以下行出现 NullPointerException 错误:process.insertFirst(..)process.display()。当我在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(); 
    }     
}
4

5 回答 5

3

在第二个代码示例中,您没有process像在第一个代码示例中那样进行初始化。因此,Java 自动将其初始化为null,根据JLS 4.12.5。利用:

private LinkedList process = new LinkedList();

或者您可以使用构造函数:

public FCFS() {
    process = new LinkedList();
}
于 2013-03-26T17:44:27.377 回答
3

在第二个版本中,您永远不会初始化process,因此它的默认值为 null。当你取消引用它时,你会得到一个NullPointerException.

如果您在局部变量版本中初始化processnull您将遇到完全相同的问题......如果您process在实例字段版本中初始化为非空值,它将起作用。但目前尚不清楚它应该在哪里初始化——这将取决于类其余部分的设计。

如果你根本不初始化局部变量,你会得到一个编译时错误:虽然字段有默认值(0、null、false 等),但局部变量没有——编译器会确保你没有从未明确分配的变量中读取。

请注意,如果您只需要一个变量在方法的持续时间内有效 - 如果它在逻辑上不是类状态的一部分 - 无论如何它最好是一个局部变量。

另请注意,Java 已经带有(通用)LinkedList类型。我希望此代码仅用于学术目的:)

于 2013-03-26T17:44:40.920 回答
3

当您在方法中声明它时,您还分配了一个非空值

LinkedList process = new LinkedList(); 

在类内部,java 编译器使用 null 值初始化流程变量,因此初始化 NPE。要解决您需要将私有变量声明为

private LinkedList process = new LinkedList(); 
于 2013-03-26T17:45:54.280 回答
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();
于 2013-03-26T17:48:55.073 回答
1

你面临什么样的错误是空指针异常?尝试初始化链表 1st

private LinkedList process = new LinkedList();
于 2013-03-26T17:46:35.673 回答