#java #android #arrays
#java #Android #массивы
Вопрос:
В приложении, которое я создаю, есть много картинок, которые пользователь сможет прокручивать, в приложении есть массив объектов, и каждый объект содержит картинку и статистику. Мое приложение работало отлично, мой массив содержал бы только 58 объектов, однако теперь, когда я создаю приложение, оно завершает работу и выдает сообщение об ошибке «Извините, ваше приложение неожиданно остановилось», а ЛогКэт показывает
10-25 18:46:24.578: ERROR/AndroidRuntime(491): FATAL EXCEPTION: main
10-25 18:46:24.578: ERROR/AndroidRuntime(491): java.lang.RuntimeException: Unable to
instantiate activity ComponentInfo{com.example.notes/com.example.notes.NotesListActivity}:
java.lang.ArrayIndexOutOfBoundsException
и вот мой текущий код
public class NotesListActivity extends Activity implements OnClickListener
{
public boolean nextClicked = false;
public boolean prevClicked = false;
public int counter = 1;
public int nextImg;
public FunnyPic[] picArray = new FunnyPic[55];
{
picArray[0] = new FunnyPic(R.raw.img1, 0);
picArray[1] = new FunnyPic(R.raw.img2, 0);
.....
.....
.....
picArray[180] = new FunnyPic(R.raw.img181, 0);
picArray[181] = new FunnyPic(R.raw.img182, 0);
}
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button changePicButton = (Button) this.findViewById(R.id.button1);
changePicButton.setOnClickListener(this);
}
public void onClick(View view)
{
Log.i("onClick", "BEGIN");
ImageView image = (ImageView) findViewById(R.id.imageView1);
if(counter == picArray.length-1)
counter=0;
image.setImageResource(picArray[counter].getImg());
counter ;
Log.i("onClick", "END");
}
public void prevPicHandler(View traget)
{
if(counter==0)
{
counter = picArray.length-1;
}
counter--;
Log.i("onClick", "BEGIN");
ImageView image = (ImageView) findViewById(R.id.imageView1);
image.setImageResource(picArray[counter].getImg());
Log.i("onClick", "END");
}
}
пожалуйста, дайте мне знать, если у вас есть какие-либо предложения. Также, если кто-нибудь может порекомендовать более эффективный способ помещения объектов в массив, чтобы мне не приходилось вручную вставлять их каждый раз, когда я добавляю новые изображения.
Спасибо
Ответ №1:
Вы создаете массив из 55 элементов:
public FunnyPic[] picArray = new FunnyPic[55];
Максимальный допустимый индекс здесь равен 54.
Затем вы пытаетесь получить доступ к элементу 181:
picArray[181] = new FunnyPic(R.raw.img182, 0);
Как вы ожидали, что это сработает? Рассматривали ли вы возможность использования a List<FunnyPic>
вместо этого?
Обратите внимание, что у вас есть оператор объявления переменной массива, а затем отдельно блок инициализатора. У вас нет инициализатора массива. Если это то, что вы думали, что у вас было, вы должны были использовать:
public FunnyPic[] picArray =
{
new FunnyPic(R.raw.img1, 0),
new FunnyPic(R.raw.img2, 0),
...
new FunnyPic(R.raw.img182, 0)
};
Ответ №2:
Ваш максимальный индекс равен 54
, но в примере кода вы получаете доступ к индексам, превышающим этот. Хм .. интересно, в чем может быть проблема !?
Cat
Ответ №3:
Почему бы не сохранить объекты FunnyPic в ArrayList или Vector?
public ArrayList<FunnyPic> getFunnyPicArray()
{
ArrayList<FunnyPic> picList = new ArrayList<FunnyPic>();
picList.add(new FunnyPic(R.raw.img1, 0));
//..
return picList;
}