2016-01-24 83 views
-4

當我嘗試訪問我的數組時,我已經得到了NPE。即使調用.length屬性也會給我一個NPE。任何幫助,將不勝感激。這是我的構造函數和保持失敗的方法。nullpointerexception array.length java

public SkierList() { 
    Skier[] skiers= new Skier[INITIAL_CAP]; 
    for (int i = 0; i < skiers.length;i++){ 
     skiers[i] = new Skier(""); 
    } 
    int count = 0; 

} 

public void add(Skier newSkier) { 
    if (this.size() < skiers.length) 
    { 
     skiers[count] = new Skier(newSkier.getName(), newSkier.getLevel()); 
     count++; 
    } 
} 

代碼編譯,但拋出NPE在skiers.length

+0

爲什麼你有滑雪者定義爲陣列,並作爲一個對象?沒有意義 –

+0

你應該將你的數組定義爲一個全局數組,並確保你不要在數組後面命名對象 –

+0

查找變量shadowing,因爲這正是你正在做的。你可能已經有了一個你沒有向我們展示過的滑雪者領域(否則代碼不會編譯),但是你通過在構造函數中重新聲明它來隱藏它。不要這樣做。 –

回答

0

定義滑雪者全球:在構造函數中重新聲明它

public Skier[] skiers= new Skier[INITIAL_CAP]; 
+0

他已經在全球定義滑雪者,否則代碼將無法編譯。但是他不會在類範圍中初始化變量,因爲他隱藏了變量。 –

+0

但他在SkierList() –

+0

中有,但是如果他沒有在類中聲明(但不初始化它),代碼將不會編譯。 –

0

您必須陰影變量。不要這樣做,因爲它將字段留空。所以,不是這個:

public class SkierList() { 
    private Skier[] skiers; // this remains null 

    public SkierList() { 
     // you're re-declaring the skiers variable here 
     // so only this local variable is non-null 
     Skier[] skiers= new Skier[INITIAL_CAP]; 

     // .... 
    } 
} 

反倒是

public class SkierList() { 
    private Skier[] skiers; 

    public SkierList() { 
     // Skier[] skiers= new Skier[INITIAL_CAP]; // Don't do this 
     skiers = new Skier[INITIAL_CAP]; // note the difference 
    } 
} 

public class SkierList() { 
    private Skier[] skiers = new Skier[INITIAL_CAP]; 

    public SkierList() { 
     // Skier[] skiers= new Skier[INITIAL_CAP]; 
    } 
}