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

Java 在类中声明时无法访问变量。在函数中声明时工作。为什么?,java,Java,在下面的代码中,LinkedList是一个用于创建链接列表的类,它具有方法insertFirst(…)和displayList() 我试图使用该类在另一个类-->FCFS类中创建变量。在类FCFS中将其声明为私有变量会导致以下行出现NullPointerException错误:process.insertFirst(..)和process.display()。当我在work()方法中声明它时,它工作得非常好 我只是想了解为什么这样做有效: public class FCFS { p

在下面的代码中,
LinkedList
是一个用于创建链接列表的类,它具有方法
insertFirst(…)
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(); 
    }     
}

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

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

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

在第二个版本中,您从未初始化
进程
,因此它的默认值为null。当您解除对它的引用时,您将得到一个
NullPointerException

如果在局部变量版本中将
process
初始化为
null
,则会遇到完全相同的问题。。。如果在实例字段version中将
进程
初始化为非空值,它将工作。不过,现在还不清楚应该在哪里初始化它——这将取决于类的其余部分的设计

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

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


还要注意的是,Java已经附带了一个(通用的)
LinkedList
类型。我希望此代码仅用于学术目的:)

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

LinkedList process = new LinkedList(); 
在类内部,java编译器使用null值初始化进程变量,从而初始化NPE

private LinkedList process = new LinkedList(); 

你面临什么样的错误 它是空指针异常吗? 尝试先初始化链接列表

private LinkedList process = new LinkedList();

在第二个示例中,您没有初始化LinkedList(而在第一个示例中,您初始化了LinkedList)。您应该这样做:

public class FCFS {
  private LinkedList process = new LinkedList();

public void work(){

  process.insertFirst(3);

  process.displayList(); 
}

}
或者这个(我通常更喜欢这个):

在执行FCFS的代码中,work()初始化FCFS:

FCFS myFCFS = new FCFS();
myFCFS.work();
public class FCFS {
  private LinkedList process;

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

....(work method)

}
FCFS myFCFS = new FCFS();
myFCFS.work();