-2

List と Arrayの関係は何ですか。ArrayIndexOutOfBoundsException が発生するのはなぜですか?

基本的に、HQL を使用することに基づいて、メソッドに 1 つの引数を渡しています。私はArrayListの 1 つのセットを返しています。今、私の問題はそれです。この ArrayList が 0 (サイズ) よりも大きい値を返す場合、これはまさに私が望むように機能しています。

しかし、0 (サイズ) ArrayList を返すと、例外が発生します。何故ですか。どんな体でも私に説明できますか

ここで、arraylist が 5(最初) と 0(テストしたサイズの 2 番目) を返す場合のように、もう 1 つ疑問があります。例外は発生しません。しかし、200以上の要素が返されると、例外が発生します。何故ですか?特定の定数番号はありますか?これまでの多くの要素の配列のように、IndexOutofBounds などを与えるべきではありませんか? 誰かが私に説明できますか?

ここに私のコードがあります:

  public void setUpDisplay()
  {
    if (_flatView || _expired || _issue){ // these are all my views.
        _deptBalances = fetchBalances(null);
    }
    else if (_searchGen.getGenericName() != null){ 
        _storeGenList.clear();
        _deptBalances = fetchBalances(_searchGen.getGenericName());
        if (!ListUtil.nullOrEmptyList(_deptBalances)){
            // i am displaying the result here.
        }
        else {
            displaying error message.
        }
    }
      // here i am using my _deptBalances to display(i am just putting this list into displaygroup).
} 

// これが私のメソッドです。

    public List<DEPTStoreBalance> fetchBalances(String genName){
    EntityManager em // Creating instance to entity manager.
    List <DEPTStoreBalance> tempList = ListUtil.list();
    String expClause =  new String();
    if (_expired){
        expClause = "and gg.bSubjectToExpiration=true " +
                    "and msb.expirationDate <= :expDate ";
        if(_expiringOnly){
            expClause = expClause.concat(" and msb.expirationDate > :today");
        }
        else {
            expClause = expClause + 
                        "and (msb.expirationDate > :today " +
                        "or (balance.qtyBalance > 0 or balance.qtyInTransit > 0)) ";
        }
    }
    else {
        expClause = "and ((gg.bSubjectToExpiration=true " +
                    "and msb.expirationDate > :expDate) " +
                    "or gg.bSubjectToExpiration=false) ";

        if (_flatView || _issue){
            expClause = expClause.concat("and (balance.qtyBalance > 0 or balance.qtyInTransit > 0) ");
        }
        else if (genName != null){
            expClause = expClause.concat("and gg.genericName = :genName ");
        }
    }

    String hql = "select balance from DEPTStoreBalance as balance " +
                 " "+ // here are my joins with multiple tables.
                 "where dsg.store = :store " +
                 expClause;

    if (_issue)
        hql = hql.concat(" and dsi.deptIssue = :deptIssue");
    Query q = em.createQuery(hql);
    q.setParameter("store", _store); // here i am selecting the store(which is being changing in search component).
    if (_issue)//Only saleable items should be issued
        q.setParameter("expDate",12 months);
    else 
        q.setParameter("expDate",_minExpDate ); // constant value :3
    if (_expired)
        q.setParameter("today", new Date());
    if (genName != null){
        q.setParameter("genName", genName);
    }
    if (_issue)
        q.setParameter("deptIssue", true);

    try{
        tempList = (List <DEPTStoreBalance>) q.getResultList();
    }
    catch (NoResultException nre){
        //do something
    }
    finally {
        em.close();
    }       
    return tempList;        
}
4

4 に答える 4

1

Arraylistは動的配列です。配列のサイズは固定されていますが、Arraylistは固定されていません。

例:配列を次のように宣言する場合

int[] arr = new int[5];

配列のサイズを指定する必要があります。

  ArrayList al = new ArrayList();
  if(al.size()>0) { 
   // do your things 

}
于 2012-09-21T15:15:44.843 に答える
1

ArrayList は、動的に成長する配列に他なりません。

空のリストを受け取り、存在しない特定の場所にアクセスしようとすると、 ArrayIndexOutOfBoundException とも呼ばれる内部配列の境界を超えたことを訴える例外が JVM によってスローされるため、ArrayIndexOutofBoundException が発生しています。

たとえば、空の ArrayList がある場合、リストのサイズは 0 になります。ただし、0 以上のインデックスにアクセスしようとすると、JVM は ArrayIndexOutofBoundException をスローします。

于 2012-09-21T15:16:20.827 に答える
0

ArrayListarrayコンテンツを保存するために内部的に使用します。ArrayList基本的には一種の動的arrayです。

利用できない要素にアクセスしようとするとindex、が取得されますArrayIndexOutofBoundsException

于 2012-09-21T15:14:18.650 に答える
0

たとえばList、3 人のメンバーがいてcalling list.get(5)、例外がスローされた場合。ArrayListが Java 配列で実装されているためです。

于 2012-09-21T15:16:33.200 に答える