после успешной инициализации массива объектов происходит сбой приложения - PullRequest
0 голосов
/ 27 мая 2020

Я хочу инициализировать массив объектов из массива строк.

У меня есть массив с 6 записями String, и я хочу инициализировать два объекта с той же записью String, что означает в объектах массива будет 12 записей.

по какой-то причине мне удается создать экземпляр массива объектов, но после l oop завершения приложения cra sh.

public class Card {
    private String pic;

    public Card(String pic) {
        this.pic = pic;
    }

    public String getPic() {
        return pic;
    }

    public void setPic(String pic) {
        this.pic = pic;
    }

    @Override
    public String toString() {
        return "Card{" +
                "pic='" + pic + '\'' +
                '}';
    }
}

END OF Card File.

package com.example.memorygame;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class MainActivity extends AppCompatActivity {
    private void main() {
        String[] pictures = {"crocodile", "duck", "lizard", "mosqitue", "parrot", "zebra"};
        //String[] pictures = {"crocodile", "crocodile", "duck","duck", "lizard","lizard", "mosqitue","mosqitue", "parrot","parrot", "zebra" ,"zebra"};
        Card[] cards = new Card[pictures.length*2];
        Functions functions = new Functions();

        for (int i = 0; i < cards.length*2; i+=2) {
            cards[i] = new Card(pictures[i/2]);
            cards[i + 1] = new Card(pictures[i/2]);
            Log.i("case", cards[i].getPic()+" "+String.valueOf(i));
            Log.i("case", cards[i].getPic()+" "+String.valueOf(i+1));
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        main();
    }
}

Это журналы консоли, которые показывают, что массив полностью уложен, а затем приложение cra sh.

2020-05-27 17:36:37.345 358-358/? I/case: crocodile 0
2020-05-27 17:36:37.345 358-358/? I/case: crocodile 1
2020-05-27 17:36:37.345 358-358/? I/case: duck 2
2020-05-27 17:36:37.345 358-358/? I/case: duck 3
2020-05-27 17:36:37.345 358-358/? I/case: lizard 4
2020-05-27 17:36:37.345 358-358/? I/case: lizard 5
2020-05-27 17:36:37.345 358-358/? I/case: mosqitue 6
2020-05-27 17:36:37.345 358-358/? I/case: mosqitue 7
2020-05-27 17:36:37.345 358-358/? I/case: parrot 8
2020-05-27 17:36:37.345 358-358/? I/case: parrot 9
2020-05-27 17:36:37.345 358-358/? I/case: zebra 10
2020-05-27 17:36:37.345 358-358/? I/case: zebra 11

У меня нет ничего после этого журналы, и я не нахожу причины, по которой приложение cra sh.

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Вы выполняете итерацию с неправильной длиной, что вызывает исключение IndexOutOfBoundsException, поэтому приложение дает сбой.

for (int i = 0; i < cards.length; i+=2) {
        cards[i] = new Card(pictures[i/2]);
        cards[i + 1] = new Card(pictures[i/2]);
        Log.i("case", cards[i].getPic()+" "+String.valueOf(i));
        Log.i("case", cards[i+1].getPic()+" "+String.valueOf(i+1));
    }

А также в последней строке Log.i вы печатали значение карт [i], которое дает такое же значение, но его неправильное значение: печаталось только значение 0,2,4, 6,8,10. Он должен напечатать значение 0,1,2,3,4,5,6,7,8,9,10,11.

1 голос
/ 27 мая 2020

Вы iterating i < cards.length*2, что вызывает ArrayIndexOutOfBoundsException на i + = 2, тогда как условие должно быть i < pictures.length. Попробуйте изменить условие, как показано ниже, в l oop, и оно должно работать нормально.

 for (int i = 0; i < pictures.length; i++) {
      cards[2*i] = new Card(pictures[i]);
      cards[2*i + 1] = new Card(pictures[i]);
      Log.i("case", cards[2*i].getPic()+" "+String.valueOf(i));
      Log.i("case", cards[2*i+1].getPic()+" "+String.valueOf(i+1));
}

Кроме того, убедитесь, что ваш logcat имеет конфигурацию this , чтобы иметь возможность видеть исключение при сбое приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...