在类中声明时无法访问变量。在函数中声明时工作。为什么?

时间:2013-03-26 17:43:14

标签: java

在以下代码中,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(); 
    }     
}

5 个答案:

答案 0 :(得分:3)

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

private LinkedList process = new LinkedList();

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

public FCFS() {
    process = new LinkedList();
}

答案 1 :(得分:3)

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

如果您在本地变量版本中初始化processnull,您将得到完全相同的问题...并且如果您将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();