2014-01-26 87 views
0

美好的一天,我有一點設計問題,通過我真的不能讓我的頭,我希望我能解釋清楚所有的理解。我有一個ClassA的是包含一個ClassB的的ArrayList所以ClassA的是單:Java.lang.IndexOutOfBoundException在類的ArrayList對象

private classA(){ 
    //private constructor 
} 

public static synchronized classA getClassA(){ 
    if(ClassA == null){   
     ClassA = new ClassA(); 
    } 
    return ClassA; 
} 

private ArrayList<ClassB> classb = new ArrayList<ClassB>(5); 

public ArrayList<ClassB> getClassB(){ 
    return this.classb; 
} 

public ClassB getLastClassB() { 
    return this.classb.get(this.classb.size() - 1); 
} 

在ClassB的,我有D類的ArrayList,其中D類就是一個類的getter和setter的,所以我的ClassB的是:

public ClassB() { 

} 

private ArrayList<ClassD> classd = new ArrayList<ClassD>(); 


    public ArrayList<ClassD> getClassD(){ 
     return this.ClassD; 
    } 

    public ClassD getLastClassD() { 
     return this.ClassD.get(this.ClassD.size() - 1); 
    } 

這樣,當我想要的清單中ClassA的對象與CLASSB和D類對象,我做

ClassA A = ClassA.getClassA(); 


     Class B B = new ClassB(); 

     ClassD D = new ClassD(); 
      //do some setters here for D 

      B.getClassD.add(D) 

      // do some things in B 

      A.getClassB.add(B) 

但是當我嘗試訪問此另一個類,我得到一個java .lang .IndexOutOfBoundsException:指數:0,大小:0我的猜測是從ClassB的持有D類的ArrayList的,因爲其他功能正在..

for(int i = 0; i < classA.getClassB.size(); i++) 
    if(classA.getClassB().get(i).getClassD().size() > 0){ //java.lang.indexOutOfBoundsException 

任何想法可能是錯誤的或者是從我的設計實現方式? ..我不能讓ClassB的另一辛格爾頓,因爲那樣我會在ArrayList中ClassA的相同ClassB的對象。任何更好的實現的想法?..非常感謝提前。

+0

ArrayList 或ArrayList 中沒有任何項目請檢查 – Luc

+0

new ArrayList (5);創建初始容量爲5的空列表,不包含5個項目 – Hurda

回答

0

this.ClassD.get(this.ClassD.size() - 1)和代碼的另一個類似的線,是size()調用始終保證返回的值大於零?換句話說,你能保證名單總是至少有一個元素?顯然不是,那麼是的,這是一個不好的設計。

您的getLastClassX()方法應準備返回null,因此在嘗試獲取大小爲() - 1的項目之前,請在列表中調用!isEmpty()

0

很抱歉,但我需要提高我的英語。

的問題應該是如下: 如果getclassb返回B的數組,但他們中的一個不initializated然後你做.getClassD那麼Java拋出異常