2013-03-26 69 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();