2014-01-26 59 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抛出异常