마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

arrayindexoutofboundsexception 가 발생합니다.(수정)

0 추천

안녕하세요.

커스텀 리스트 뷰 예제를 참조해서 샘플을 하나 만들었는데.. 추가버튼을 눌러서 새로운 row를 생성하면

arrayindexoutofboundsexception 에러가 발생합니다.. 구글링을 해보니 없는 index를 참조해서 생기는 오류라는데요,

앱이 강제종료 되고 다시 들어가면 리스트에 새 항목은 추가가 되어있습니다.;

버튼을 눌렀을 때 arrList.add("새항목내용"); 이런식으로 추가해줬는데요, 이 부분을 어댑터 클래스 쪽으로 옮겨야 하는지요?

 

+조언받고 소스 까지 올립니다..


import java.util.ArrayList;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.TextView;

class cAdapter extends BaseAdapter{
	private int selectedPos = -1; 
	private int setPos=0;//
	private Context mContext = null;
    private ArrayList<String> mListData = new ArrayList<String>();
    private boolean[] isCheckedConfrim;
    public cAdapter(Context mContext, ArrayList<String> arrayList)
    {
    	super();
    	this.mContext = mContext;
    	mListData = arrayList;
    	this.isCheckedConfrim = new boolean[mListData.size()]; 
    }
    
    public void setChecked(int position) {
        isCheckedConfrim[position] = !isCheckedConfrim[position];
    }
    
    public ArrayList<Integer> getChecked(){
    	int tempsize = mListData.size();
    	ArrayList<Integer> mArrayList = new ArrayList<Integer>();
    	for(int i = 0; i<tempsize; i++){
    		if(isCheckedConfrim[i]){
    			mArrayList.add(i);
    		}
    	}
    	return mArrayList;
    }
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return mListData.size();
	}
	
	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return mListData.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	
	public void setSelectedPosition(int pos){
		selectedPos = pos;
		// inform the view of this change
		notifyDataSetChanged();
	}
	 public void setCount(int pos){
		 pos =  mListData.size() ;
//		 mListData.size() = pos;
			// inform the view of this change
			notifyDataSetChanged();
		}
	
	
	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		ViewHolder holder;
	    if (convertView == null) {
	        holder = new ViewHolder();
	 
	        LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	        convertView = inflater.inflate(R.layout.listview_custom, null);
	 
	        holder.textview = (TextView) convertView.findViewById(R.id.listText);
	        holder.checkbox = (CheckBox) convertView.findViewById(R.id.checkbox_stu);
	 
	        convertView.setTag(holder);
	    }else
	    {
	        holder = (ViewHolder) convertView.getTag();
	    }
	 
	    holder.textview.setText(mListData.get(position));
	    holder.checkbox.setClickable(false);
	    holder.checkbox.setFocusable(false);
	
	    holder.checkbox.setChecked(isCheckedConfrim[position]); 
	    //추가할 때 에러 발생arrayindexoutofboundsexception
	    //cAdapter.java에서 배열 삭제(poisition)/추가 처리.
	   // holder.checkbox.setChecked(false); 
	 
	    return convertView;
	}
//	리스트뷰에 들어갈 체크박스클래스
	public class ViewHolder{
		public CheckBox checkbox;
		public TextView textview;
	}
	
}

 

 

로그 확인해보니,

java.lang.ArrayIndexOutOfBoundsException: length=0; index=0

java.lang.ArrayIndexOutOfBoundsException: length=1; index=1 ....

이런식으로 length와 index는 추가할 때마다 증가 합니다.

[물론 추가 버튼을 누르면 앱이 강제종료 되었다가,. 다시 들어가면 또 리스트에 멀쩡히 추가 되어있네요,]

없는 인덱스?를 참조해서 발생하는 에러인가요..?
 

배열은 0번째부터 시작하니까, 길이가 2면 [0][1]  index=0,1 이런식으로 되어야 하는데,

위에 보면 length가 1인데 [0] <-이거하나, index=0이 아닌 index=1을 참조해서 그런건가요..?

아직 이해가 되질 않습니다..ㅠㅠ

 항목을 추가하는 부분은 다른 java 클래스에서 추가 버튼을 눌렀을 때

arrList.add(항목텍스트); // 리스트에 추가. 
이런식으로 구현했습니다..추가 삭제로 길이가 가변적인 리스트라서 for문으로 일정갯수만큼 딱 추가한다거나 뭐 그런건 없구요..for문 없이 텍스트값 받아서 저렇게 add하도록 햇습니다..ㅠㅠ
로그 찍어보니 arrList.add(); 넘어는 가고, 바로 java.lang.ArrayIndexOutOfBoundsException: length=3; index=3
이런식으로 에러가 찍히네요.add하는 애가 4번째 녀석인데, 왜 length값이 3인지 모르겠습니다. add하면
4로 하나 추가 되고, index는 3인게 맞지 않나요..?
 
+자꾸 수정하게 되서 죄송합니다;;
log로 확인해봤는데요, 현재 회원이 5명이었을 때, 6명으로 추가하려고 추가버튼을 눌렀는데요,
arrList().add 다음에 나오는 로그가 저 new array list 입니다. 6은 arrList.size() 구요,
다섯명에서 한명 추가했으니 6이 나오는건 맞는거같은데, 그 밑에 바로 에러가 뜨면서 length가 5로 나오네요..
length가 arrList.size와 동일해야 하는거 아닌가요?
anci (19,950 포인트) 님이 2014년 6월 10일 질문
anci님이 2014년 6월 10일 수정

2개의 답변

+1 추천
 
채택된 답변

public cAdapter(Context mContext, ArrayList<String> arrayList)

{
        super();
        this.mContext = mContext;
        mListData = arrayList;
        this.isCheckedConfrim = new boolean[mListData.size()]; 
}
 
위와 같이 어댑터를 생성할 때,
전달받는 arrayList 의 사이즈만큼
boolean형 변수 isCheckedConfirm 에 배열 사이즈를 할당해주셨네요
 
따라서 어댑터를 생성할때 던져준 리스트의 사이즈가 체크변수의 크기로 고정이 되버리는거죠
새로 선언하지 않는 이상은요
 
그렇기때문에 만약 생성 시 리스트의 사이즈가 5였다면 아래와 같이
boolean isCheckedConfirm[5] 로 정의됨
 
추가 시 mListData 의 포지션을 가져와서 5가 되는데
isCheckedConfirm[position]
위의 배열 인덱스는 0, 1, 2, 3, 4 까지만 허용되지요
 
길이가 5인데 인덱스가 5 를 찾아 에러를 표시하는겁니다.
초보개발자ㅠ (33,870 포인트) 님이 2014년 6월 11일 답변
anci님이 2014년 6월 11일 채택됨
댓글 감사합니다.
초보개발자님의 댓글 보고 이렇게 이해했는데 맞는지요?
말씀해 주신대로 학생수가 5명이면 [0],[1],[2],[3],[4] 총 사이즈가 5이고,
어댑터 생성할 때 저 어레이리스트 만큼 isCheckedConfirm이 생성되니 저 사이즈도 5구요..
지금 현재 발생하는 문제가, 이 상태에서 [추가 버튼]을 누르고 학생 이름을 입력한 후 확인 버튼을 누르면 length와 index가 어긋나서 에러가 발생하는게, 학생쪽 list 사이즈는 1 증가 했는데, isCheckedConfirm은 증가하지 않아서 그렇게 된건가요?
네~ 그렇게 된겁니다 '-'
아..그럼 추가쪽에서 학생 list가 1 추가 될 때, isCheckedConfirm 얘도 1추가가 되어야 한다는거군요...감사합니다..
+1 추천
제 생각에는~

그건.. 구현하기 나름이라 소스를 올려보시는게 좋지 않을까 싶네요 ^^;

흐름을 이해하시는게 먼저인듯합니당
초보개발자ㅠ (33,870 포인트) 님이 2014년 6월 10일 답변
감사합니다..일단 말씀하신대로 소스는 올려봤습니다 ㅠㅠ
...