Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Belle7
0 / 0 / 0
Регистрация: 06.08.2014
Сообщений: 5
#1

Ошибка ArrayIndexOutOfBoundsException - Программирование Android

06.08.2014, 02:18. Просмотров 882. Ответов 10
Метки нет (Все метки)

Доброго времени суток.

Просьба помочь начинающему программисту разобраться с проблемой: Ошибка ArrayIndexOutOfBoundsException length=8 index=-2
Код прилагаю. Большая просьба подсказать в каком именно месте проблема.
Использую массив в ресурсах.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package com.example.ouatquiz;
 
import android.app.Activity;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.view.Display;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AbsoluteLayout;
import android.widget.Button;
import android.widget.Toast;
 
public class QuizActivity extends Activity implements OnClickListener {
    /** Called when the activity is first created. */
    private AbsoluteLayout Abs;
    private Button Question;
    private Button[] Answers=new Button[4];
    private double width;
    private double height;
    private static final int QUESTIONS=8;
    private static final int VARIANTS=4;
    private static final char DELIMITER='/';
    private String[][] AnsMatrix=new String[VARIANTS][QUESTIONS];
    private int[] RightAnswers=new int[QUESTIONS];
    private String[] Ques=new String[QUESTIONS];
    private TypedArray Base;
    private int time=0;
    private int total_time=3;
    private int right=0;
    private int wrong=0;
    private int current_right=0;
    private AbsoluteLayout.LayoutParams[] params=new AbsoluteLayout.LayoutParams[VARIANTS+1];
    @Override
    public void onCreate(Bundle savedInstanceState) {
        try{
           super.onCreate(savedInstanceState);
           Abs=new AbsoluteLayout(this);
           setContentView(Abs);
           Display display = getWindowManager().getDefaultDisplay(); 
           width=display.getWidth();
           height=display.getHeight();
           Question= new Button(this);
           params[0]=new AbsoluteLayout.LayoutParams(
                 (int)width,(int)height/4,0,0
           );
           Question.setLayoutParams(params[0]);
           Abs.addView(Question);
           Question.setOnClickListener(this);
           //
           for (int i=1;i<VARIANTS+1;i++){
              int k=i%2;
              int m;
              if (i<3) m=1;
              else{
                  m=2;
              }
              Answers[i-1]= new Button(this);
              params[i]=new AbsoluteLayout.LayoutParams(
                    (int)width/2,(int)height/4,(int)(k*width/2),(int)(m*height/4)
              );
              Answers[i-1].setLayoutParams(params[i]);
              Abs.addView(Answers[i-1]);
              Answers[i-1].setOnClickListener(this);
           }
           //getSubstringBetweenDelimiters(2,3,"/Question1/Variant11/Variant12/Variant13/Variant14/Answer1/");
           //Toast.makeText(this, getSubstringBetweenDelimiters(5,6,"/Question1/Variant11/Variant12/Variant13/Variant14/Answer1/"), Toast.LENGTH_LONG).show();
           LoadQuestions();
           LoadQuestion();
        }
        catch(Exception e){
            Toast.makeText(this, e+"", Toast.LENGTH_LONG).show();
        }
    }
    
   private void LoadQuestion() {
         int qs=(int)System.currentTimeMillis()%QUESTIONS;
         Question.setText(Ques[qs]);
         for (int i=0;i<VARIANTS;i++){
            Answers[i].setText(AnsMatrix[i][qs]);
         }
         current_right=RightAnswers[qs]-1;
   }
    
   private void LoadQuestions(){
        Resources res=getResources();
        Base=res.obtainTypedArray(R.array.Questions);
        for (int i=0;i<QUESTIONS;i++){
            Ques[i]=getSubstringBetweenDelimiters(0,1,Base.getString(i));
            for (int j=0;j<VARIANTS;j++){
                AnsMatrix[j][i]=getSubstringBetweenDelimiters(j+1,j+2,Base.getString(i));
            }
            RightAnswers[i]=Integer.parseInt(getSubstringBetweenDelimiters(VARIANTS+1,VARIANTS+2,Base.getString(i)));
        }
    }
   
    private String getSubstringBetweenDelimiters(int k, int m, String str){
        int index1=0;
        int index2=0;
        int len=str.length();
        int dels=0;
        for (int i=0;i<len;i++){
            if (str.charAt(i)==DELIMITER){
                dels++;
            }
            if (dels==k){
                index1=i;
            }
            if (dels==m){
                index2=i;
            }
        }
        //Toast.makeText(this, index1+" "+index2, Toast.LENGTH_LONG).show();
        return str.substring(index1+2, index2+1);
    }
    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub
        if (arg0==Question){
            wrong++;
        }
        else{
            wrong++;
            for (int i=0;i<VARIANTS;i++){
                if (arg0==Answers[i]){
                    if (current_right==i){
                        wrong--;
                        right++;
                    }
                }
            }
        }
        time++;
        LoadQuestion();
        if (time==total_time){
            Stats();
            time=0;
            right=0;
            wrong=0;
        }
    }
    
    private void Stats() {
        // TODO Auto-generated method stub
        double rating=Math.round(((double)right/((double)right+(double)wrong))*100);
        String stat="";
        stat+=getString(R.string.note1);
        stat+=" "+right+" ";
        stat+=getString(R.string.note2);
        stat+=" "+total_time+". ";
        stat+=getString(R.string.note3);
        stat+=" "+(rating+"").substring(0,(rating+"").length()-2);
        Toast.makeText(this, stat, Toast.LENGTH_LONG).show();
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.08.2014, 02:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка ArrayIndexOutOfBoundsException (Программирование Android):

Ошибка при запуске проекта ArrayIndexOutOfBoundsException - Программирование Android
Доброго времени суток. Понимаю, что обращаюсь с данной проблемой во второ Добавлено через 15 минут Удалите тему, пожалуйста.

ArrayIndexOutOfBoundsException - Программирование Android
Есть лог. Понимаю, что ошибка в строке 31, но там скобка. В чём ошибка? @Override public void onCreate(Bundle...

Ошибка - ArrayIndexOutOfBoundsException - Java SE
всем привет) собственно, в чём проблема. имеется программа, написанная в среде NetBeans. при запуске в среде она работает как надо...

Ошибка в задании. ArrayIndexOutOfBoundsException - Java SE
Дали задание по джаве на дом, переписал код программы в NetBeans из методички, но при запуске вылезает ошибка: &quot;Exception in thread...

Ошибка java.lang.ArrayIndexOutOfBoundsException - Java
Возникает ошибка на 10 строке java.lang.ArrayIndexOutOfBoundsException при переводе массива в двумерный, ошибка в 1 из 10 случаев...

Ошибка java.lang.ArrayIndexOutOfBoundsException - Java
Есть программа, которая считает корреляцию. Ей на вход подается файл csv, из которого она считывает значения и выполняет подсчет. Но если в...

10
dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
06.08.2014, 06:36 #2
Сами попробуйте. В ошибке написано, что размер массива 8 элементов, вы пытаетесь взять данные в элементе с индексом -2, а такого быть не может, отсюда и ошибка. Пробегитесь и посмотрите, почему у вас -2.
0
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,654
Завершенные тесты: 1
06.08.2014, 11:41 #3
Зачем такое:
Java
1
2
3
for (int i=1;i<VARIANTS+1;i++)
..................
Answers[i-1]= new Button(this);
?
Нужно так:
Java
1
2
3
for (int i=0;i<VARIANTS;i++)
..................
Answers[i]= new Button(this);
Хоть и аналогично для компилятора, но для человека сложно читаемо - потому и ошибку найти сложнее. Попробуйте переписать все циклы так, если ошибка останется - найти будет уже значительно проще.
0
Belle7
0 / 0 / 0
Регистрация: 06.08.2014
Сообщений: 5
06.08.2014, 13:59  [ТС] #4
Spelcrawler, сделала так, как Вы написали.
Увы, не помогло.
0
Pablito
2525 / 2004 / 624
Регистрация: 12.05.2014
Сообщений: 7,030
Завершенные тесты: 1
06.08.2014, 14:02 #5
Строку хотя бы на которую ругается, а то нет желания делать проект и запускать все это.
0
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,654
Завершенные тесты: 1
06.08.2014, 14:03 #6
Belle7, Ну тут без полного текста ошибки, сложно разобраться. Где то у вас индекс выходит за границы массива, а где написано в ошибке.
0
Belle7
0 / 0 / 0
Регистрация: 06.08.2014
Сообщений: 5
06.08.2014, 23:15  [ТС] #7
Доброго времени суток.
Понимаю, что обращаюсь с данной проблемой во второй раз. Однако в прошлый раз устранить ошибку, к сожалению, никто помочь не смог. Именно поэтому решила выложить весь код с описанием.

Программа - тест. На главном экране - MainActivity находятся две кнопки: начать и выход. При нажатии на "начать" должен запускаться тест из файла ресурсов (массив, в котором содержатся вопросы, варианты ответов и верные ответы на каждый из вопросов). Однако при нажатии на "начать" выходит ошибка с текстом: java.lang.ArrayIndexOutOfBoundsException length=8 index=-2 (причем при каждом запуске программы значения index разные).

MainActivity скидывать не буду.

Вот код:

Массив, в котором и находятся вопросы, варианты ответов и верные ответы на тест.
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <array name="Questions">
        <item>/nQuestion1/Variant11/Variant12/Variant13/Variant14/2/</item>
        <item>/nQuestion2/Variant21/Variant22/Variant23/Variant24/2/</item>
        <item>/nQuestion3/Variant31/Variant32/Variant33/Variant34/3/</item>
        <item>/nQuestion4/Variant41/Variant42/Variant43/Variant44/4/</item>
        <item>/nQuestion5/Variant51/Variant52/Variant53/Variant54/1/</item>
        <item>/nQuestion6/Variant61/Variant62/Variant63/Variant64/2/</item>
        <item>/nQuestion7/Variant71/Variant72/Variant73/Variant74/3/</item>
        <item>/nQuestion8/Variant81/Variant82/Variant83/Variant84/4/</item>
    </array>
</resources>
Файл strings.xml
XML
1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">OUaT Quiz</string>
    <string name="note1">You have picked</string>
    <string name="note2">right answers from</string>
    <string name="note3">Your rating is</string>
</resources>
Собственно, главный файл QuizActivity
Здесь распишу все подробнее:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
package com.example.ouatquiz;
 
import android.app.Activity;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.view.Display;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AbsoluteLayout;
import android.widget.Button;
import android.widget.Toast;
 
public class QuizActivity extends Activity implements OnClickListener {
    
        //программно создаем экран, при этом задаем параметры экрана и параметры для AbsoluteLayout
    private AbsoluteLayout Abs;
    private Button Question;
    private Button[] Answers=new Button[4];
    private double width;
    private double height;
 
        //переменный для хранения констант (кол-во вопросов, ответов и константа для разделителя в arrays.xml)
    private static final int QUESTIONS=8;
    private static final int VARIANTS=4;
    private static final char DELIMITER='/';
    private String[][] AnsMatrix=new String[VARIANTS][QUESTIONS];
    private int[] RightAnswers=new int[QUESTIONS];
    private String[] Ques=new String[QUESTIONS];
        
        //переменная, хранящая базу
    private TypedArray Base;
    private int time=0;
    private int total_time=3;
 
        //счетчики верных и неверных ответов
    private int right=0;
    private int wrong=0;
 
        //переменная, равная номеру верного ответа
    private int current_right=0;
    private AbsoluteLayout.LayoutParams[] params=new AbsoluteLayout.LayoutParams[VARIANTS+1];
 
   //программно создаем Layout
    @Override
    public void onCreate(Bundle savedInstanceState) {
        try{
           super.onCreate(savedInstanceState);
           Abs=new AbsoluteLayout(this);
           setContentView(Abs);
           Display display = getWindowManager().getDefaultDisplay(); 
           width=display.getWidth();
           height=display.getHeight();
           Question= new Button(this);
           params[0]=new AbsoluteLayout.LayoutParams(
                 (int)width,(int)height/4,0,0
           );
           Question.setLayoutParams(params[0]);
           Abs.addView(Question);
           Question.setOnClickListener(this);
           
           for (int i=1;i<VARIANTS+1;i++){
              int k=i%2;
              int m;
              if (i<3) m=1;
              else{
                  m=2;
              }
              Answers[i-1]= new Button(this);
              params[i]=new AbsoluteLayout.LayoutParams(
                    (int)width/2,(int)height/4,(int)(k*width/2),(int)(m*height/4)
              );
              Answers[i-1].setLayoutParams(params[i]);
              Abs.addView(Answers[i-1]);
              Answers[i-1].setOnClickListener(this);
           }
          
 
           LoadQuestions();
           LoadQuestion();
 
        }
        catch(Exception e){
            Toast.makeText(this, e+"", Toast.LENGTH_LONG).show();
        }
    }
    
    //выбирает случайный вопрос, пишет на кнопки соответствующие тексты, и заносит в специальную переменную     правильный ответ. qs - номер случайно выбранного вопроса.
          private void LoadQuestion() {
         int qs=(int)System.currentTimeMillis()%QUESTIONS;
         Question.setText(Ques[qs]);
         for (int i=0;i<VARIANTS;i++){
            Answers[i].setText(AnsMatrix[i][qs]);
         }
         current_right=RightAnswers[qs]-1;
   }
    
    //функция для загрузки всех вопросов из базы
   private void LoadQuestions(){
        Resources res=getResources();
        Base=res.obtainTypedArray(R.array.Questions);
        for (int i=0;i<QUESTIONS;i++){
            Ques[i]=getSubstringBetweenDelimiters(0,1,Base.getString(i));
            for (int j=0;j<VARIANTS;j++){
                AnsMatrix[j][i]=getSubstringBetweenDelimiters(j+1,j+2,Base.getString(i));
            }
            RightAnswers[i]=Integer.parseInt(getSubstringBetweenDelimiters(VARIANTS+1,VARIANTS+2,Base.getString(i)));
        }
    }
   
    //принимает 3 параметра: исходную строку, и два целых числа и определяют подстроку, лежащую в исходной   строке между теми по счету разделителями, которые определяют первые 2 аргумента.
    private String getSubstringBetweenDelimiters(int k, int m, String str){
        int index1=0;
        int index2=0;
        int len=str.length();
        int dels=0;
        for (int i=0;i<len;i++){
            if (str.charAt(i)==DELIMITER){
                dels++;
            }
            if (dels==k){
                index1=i;
            }
            if (dels==m){
                index2=i;
            }
        }
        
        return str.substring(index1+2, index2+1);
    }
 
        //обработчик нажатия на кнопку
    @Override
    public void onClick(View arg0) {
        
        if (arg0==Question){
            wrong++;
        }
        else{
            wrong++;
            for (int i=0;i<VARIANTS;i++){
                if (arg0==Answers[i]){
                    if (current_right==i){
                        wrong--;
                        right++;
                    }
                }
            }
        }
        time++;
        LoadQuestion();
        if (time==total_time){
            Stats();
            time=0;
            right=0;
            wrong=0;
        }
    }
    
 
        //функция для вывода рейтинга
    private void Stats() {
        // TODO Auto-generated method stub
        double rating=Math.round(((double)right/((double)right+(double)wrong))*100);
        String stat="";
        stat+=getString(R.string.note1);
        stat+=" "+right+" ";
        stat+=getString(R.string.note2);
        stat+=" "+total_time+". ";
        stat+=getString(R.string.note3);
        stat+=" "+(rating+"").substring(0,(rating+"").length()-2);
        Toast.makeText(this, stat, Toast.LENGTH_LONG).show();
    }
}
0
Spelcrawler
527 / 497 / 111
Регистрация: 12.03.2014
Сообщений: 1,654
Завершенные тесты: 1
07.08.2014, 08:21 #8
Покажите полный текст ошибки. В нем написано где ошибка.

Добавлено через 34 минуты
Нашел вот еще
Java
1
private String[][] AnsMatrix=new String[VARIANTS][QUESTIONS];
Это вы хотите создать массив в котором 8 вопросов и 4 ответа в каждом вопросе? Если да - то нужно наоборот)
Java
1
private String[][] AnsMatrix=new String[QUESTIONS][VARIANTS];
0
Pablito
2525 / 2004 / 624
Регистрация: 12.05.2014
Сообщений: 7,030
Завершенные тесты: 1
07.08.2014, 09:34 #9
Жду третьего обращения от автора (после того как ему второй раз не помогли), который не читает что ему пишут.
0
dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
07.08.2014, 12:00 #10
Вы просто не понимаете. Автор ждет когда ей укажут конкретное место в коде где ошибка.
0
Belle7
0 / 0 / 0
Регистрация: 06.08.2014
Сообщений: 5
07.08.2014, 16:23  [ТС] #11
При запуске дебаггера выдает сразу несколько ошибок, одна из них:

This TypedArray should be recycled after use with #recycle()

Вот строка, к которой эта ошибка относится:
Java
1
Base=res.obtainTypedArray(R.array.Questions);
0
07.08.2014, 16:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2014, 16:23
Привет! Вот еще темы с ответами:

Ошибка java.lang.ArrayIndexOutOfBoundsException: -1 - Java EE
Программа представляет собой систему работы с документами(Web-приложение). В браузере, при переходе по гиперссылке, выдает следующее...

Ошибка java.lang.ArrayIndexOutOfBoundsException - Java SE
package glava3; import java.io.*; public class Vector { private int n; private int vector = new int ; public Vector() ...

Ошибка в коде java.lang.ArrayIndexOutOfBoundsException: 1 - Java SE
Программа вылетает после ввода параметров фигур. package univer.project_1.cylindr_circle; import java.util.Scanner; public...

Ошибка Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 7 - Java SE
Здравствуйте у меня такая проблема: Exception in thread &quot;main&quot; java.lang.ArrayIndexOutOfBoundsException: 7 at...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru