Приложение для Android не будет запускаться, если мой массив имеет определенную длину

#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;
}