【问题标题】:Java.lang.IndexOutOfBoundException on ArrayList of Class Objects类对象的 ArrayList 上的 Java.lang.IndexOutOfBoundException
【发布时间】:2014-01-26 16:14:17
【问题描述】:

美好的一天,我有一点设计问题,我无法真正理解,我希望我能解释清楚,让所有人都能理解。我有一个 ClassA,它是一个包含 ClassB 的 Arraylist 的单例,所以 ClassA 是:

   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 中,我有一个 ClassD 的 ArrayList,其中 ClassD 只是一个 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 和 classD 对象时,我会这样做

 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: Index: 0, Size: 0 我猜这是来自 ClassB 持有 ClassD 的 ArrayList 因为其他功能正在工作..

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

有什么想法可能是错误的,或者我的设计实现方式有问题吗?...我不能让 ClassB 成为另一个 Singleton,因为那样我将在 ArrayList ClassA 中拥有相同的 ClassB 对象。任何想法更好的实施?..提前非常感谢。

【问题讨论】:

  • ArrayList 或 ArrayList 中没有项请检查
  • 新的 ArrayList(5);创建初始容量为 5 的空列表,而不是包含 5 个项目的列表

标签: java arraylist


【解决方案1】:

this.ClassD.get(this.ClassD.size() - 1) 和另一个类似的代码行中,size() 调用是否总是保证返回大于零的值?换句话说,你能保证列表总是至少有一个元素吗?显然不是,所以是的,这是一个糟糕的设计。

您的 getLastClassX() 方法应该准备好返回 null 并因此在尝试获取 size()-1 的项目之前调用列表中的 !isEmpty()

【讨论】:

    【解决方案2】:

    对不起,我需要提高我的英语水平。

    问题应该如下: 如果 getclassb 返回一个 B 数组,但其中一个未初始化,则执行 .getClassD 然后 java 抛出异常

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      • 1970-01-01
      • 2020-07-03
      • 1970-01-01
      相关资源
      最近更新 更多