Ошибка с границами массива - PullRequest
0 голосов
/ 24 июля 2011

Я гуглил и играл разными способами, и все еще безуспешно.

По сути, я делаю передачу идентификатора ресурса в намерении для нового действия. Я извлекаю int из намерения и пытаюсь создать экземпляр объекта, используя контекст и идентификатор ресурса, которые я распаковал из намерения.

Первое действие, которое упаковывает намерение и запускает следующее действие:

case R.id.KoreanVocabularymenuBButton:          
Intent openBeginnerVocabularyActivity = new Intent(v.getContext(), KoreanVocabularyActivity.class); 
openBeginnerVocabularyActivity.putExtra("difficulty", R.raw.beginner_numbers);
startActivity(openBeginnerVocabularyActivity);
break;

Второе действие распаковывает намерение и пытается создать экземпляр объекта с данными:

int resource = getIntent().getExtras().getInt("difficulty");
korean = new KoreanVocabulary(this, resource);

Это конструктор объекта и место возникновения ошибки:

    BufferedReader br = new BufferedReader(new InputStreamReader(is));

    String word = null;

    try {
        while ((word = br.readLine()) != null){
            vocabulary[index++] = word;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

редактирование:

Индекс является целым числом. Массив словаря [] является частным членом функции. Конструктор пытается инициализировать массив.

Я попытался использовать logcat и получил немного путаницы:

I/ActivityManager(   51): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000     cmp=korean.koreanstudy/.MainMenuActivity bnds=[5,234][115,352] }
W/WindowManager(   51): No window to dispatch pointer action 0
W/WindowManager(   51): No window to dispatch pointer action 1
I/ActivityManager(   51): Displayed activity korean.koreanstudy/.MainMenuActivity: 388 ms (total 388 ms)
I/ActivityManager(   51): Starting activity: Intent {   cmp=korean.koreanstudy/.VocabularyMenuActivity }
I/ActivityManager(   51): Displayed activity korean.koreanstudy/.VocabularyMenuActivity: 322 ms (total 322 ms)
I/ActivityManager(   51): Starting activity: Intent { cmp=korean.koreanstudy/.KoreanVocabularyActivity (has extras) }
I/global  (  250): Default buffer size used in BufferedReader constructor. It would be better to be explicit if an 8k-char buffer is required.
D/AndroidRuntime(  250): Shutting down VM
W/dalvikvm(  250): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
E/AndroidRuntime(  250): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime(  250): java.lang.RuntimeException: Unable to start activity   ComponentInfo{korean.koreanstudy/korean.koreanstudy.KoreanVocabularyActivity}:      java.lang.ArrayIndexOutOfBoundsException

Причина, по которой мне нужен идентификатор ресурса, заключается в том, что я хочу инициализировать объект с определенным файловым ресурсом. Мне нужен способ определить конкретный файл. То, как я пытался это сделать, - это переключение в меню. Пользователь нажимает на уровень сложности, и в следующем упражнении для этой сложности будет загружен конкретный список. Однако мне нужно знать, какую сложность выбрал пользователь. Вот почему я пытаюсь отследить удостоверение личности.

изменить 2:

Это информация о классе и конструкторе для массива.

private int index = 0; 
private int max = 0;
private String[] vocabulary = new String[255];

public KoreanVocabulary(Context context, int resource){
    InputStream is = context.getResources().openRawResource(resource);
    BufferedReader br = new BufferedReader(new InputStreamReader(is));

    String word = null;

    try {
        while ((word = br.readLine()) != null){
            vocabulary[index++] = word;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    max = index;
    index = 0;
    } 

изменить 3:

Извините всех, я нашел проблему. У меня как-то была отключена одна ссылка при чтении из массива. Я думал, что проблема была с чтением файла, но, как вы все отметили, это было нормально - вы правы! извините!

Ответы [ 3 ]

0 голосов
/ 24 июля 2011

Если вам нужен только ресурс, вам просто нужно получить контекст (у вашей активности уже будет это) и вызывать его как обычно. Вы не должны передавать ресурс.

Кроме того, вы точно не передаете ресурс за слово ... вы передаете значение этого ресурса, поэтому лучше получить доступ к нему из вашего следующего действия

0 голосов
/ 24 июля 2011

Я пытался найти связь между конструктором

korean = new KoreanVocabulary(this, resource);

и остальным кодом, но не смог найти ничего.Ошибка, которую вы получаете, я полагаю, является IOException ... откуда

BufferedReader br = new BufferedReader(new InputStreamReader(is));

получает свой ввод?Я действительно считаю, что название вопроса несколько неверно - вы передаете ресурсы между этими двумя действиями.Это не проблема в коде (конечно, если logcat не покажет что-то другое).* edit - не говоря уже о том, что, как уже говорили другие, ресурсы R. доступны повсюду, нет необходимости передавать их между действиями ...

0 голосов
/ 24 июля 2011
BufferedReader br = new BufferedReader(new InputStreamReader(is));

String word = null;

try {
    while ((word = br.readLine()) != null){
        vocabulary[index++] = word; //<!-- POI#1
    }
} catch (IOException e) {
    e.printStackTrace(); //<!-- POI#2
}

Точка интереса # 1: Откуда приходит vocabulary / index?Что это за типы данных?index, вероятно, int, но спрашивать не мешает.

Точка интереса № 2: Получаете ли вы исключение?Если так, то это IOException?Это не так, что на самом деле вы получаете ошибку?Я думаю, что вы забыли эту часть в своем первоначальном сообщении - logcat сможет дать вам необходимую информацию.

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