2013-03-26 70 views
0

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

回答

3

在第二个代码示例,你没有初始化process你在做第一个代码示例。所以Java自动将它初始化为null,每JLS 4.12.5。用途:

private LinkedList process = new LinkedList(); 

,或者你可以使用一个构造函数:

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

@Downvoter请解释你为什么低估了。 – rgettman 2013-03-26 17:53:13

3

在第二个版本,你永远初始化process,因此它将为空的默认值。当你解除引用时,你会得到一个NullPointerException

如果初始化局部变量版本processnull,你会得到完全相同的问题......如果你初始化process在实例字段版本一个非空值,它会工作。目前还不清楚其中它应该被初始化 - 但这取决于其他类的设计。

如果你根本没有初始化局部变量,你会得到一个编译时错误:字段有默认值(0,null,false等),局部变量不会 - 编译器确保您不会读取不是明确分配的变量

请注意,如果你只需要一个变量是有效的方法的持续时间 - 如果不是逻辑类的状态的一部分 - 这将是更好地为它是一个局部变量反正。

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

+0

是的,它实际上是一个分配-_-。谢谢 :)) – Nour 2013-03-26 18:04:50

3

当你在方法声明它,你也分配一个非空值

LinkedList process = new LinkedList(); 

类里面,java编译器初始化过程变量与空值,因此NPE.To解决你需要什么样的错误你面对 是一个空指针异常声明私有变量

private LinkedList process = new LinkedList(); 
1

? 尝试初始化链表1

private LinkedList process = new LinkedList(); 
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,工作()的代码初始化FCFS:

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