2017-02-05 1 views
-1

В моем приложении учитель может иметь несколько классов, и когда я исключаю профиль учителя, я должен, во-первых, удалить его классы. Я пытаюсь поместить каждый class_id этого учителя в массив int, чтобы позже удалить все классы, содержащиеся в этом массиве.IndexOutOfRange Исключение Брошено на установку значения Int для массива

Это мой код до сих пор:

int x = 0; 
int[] count = new int[x]; 

while (reader_SelectedClasses.Read()) 
{ 
    if(x != 0) 
    { 
     x++; 
     count = new int[x]; 
    } 
    count[x] = _class.Class_id = reader_SelectedClasses.GetInt16("class_id"); 
} 

И это то, что

reader_SelectedClasses.Read() 

делает:

select class_id from tbl_class where user_id = " + id + "; 

И это возвращение, когда я пытаюсь это на MySQL :

enter image description here

Но это возвращает мне исключение IndexOutOfRangeException при запуске кода в моем классе DAO. Что мне не хватает? Уже пошел here, но не совсем понял. Может кто-нибудь объяснить несколько слов и пост и фиксированный код для этого?

+0

Условный условие никогда не выполняется, и значение х никогда не увеличивается , Таким образом, вы обычно добавляете значение к тому же индексу. –

+0

После редактирования вашего вопроса я снимаю свои комментарии. –

+0

вам нужно пройтись по вашей логике по строчке, и вы увидите, где именно возникла проблема. Вы пытаетесь получить первый индекс пустого массива. Также как x будет увеличиваться? – Nkosi

ответ

1
  1. Вы должны learn how to use a debugger и шаг за шагом через вашу программу.

  2. count = new int[x]; отбрасывает то, что было в count, и создает новый массив, содержащий нули. Индексы этого массива идут от 0 до x - 1.

  3. count[x] = ... устанавливает элемент массива по индексу x, который в соответствии с предыдущей строкой проходит мимо конца массива.

Вам нужно установить count = new int[x] только один раз, в начале программы, и установить count[x] = ... только тогда, когда х> = 0 и х < count.Length.

0

Вы получаете исключение IndexOutOfRange, потому что пытаетесь получить доступ к элементу из массива, который выходит за пределы допустимого диапазона.

На первой строке вы устанавливаете x = 1. Надеясь, что контроллер входит в цикл while, а как x равен 1, он не вводит, если цикл и выполняет следующий оператор. Но count [1] (x = 1) не допускается, так как вы создали массив только с одним элементом и имеете доступ к счету [0]. (Array индексация начинается с 0)

+0

OP отредактировал его сообщение, и я думаю, что это была опечатка. – Pratik

1

Вы пытаетесь установить поведение List с помощью команды array.
Очевидно, что IndexOutOfRangeException - это то, что вы инициализируете пустой массив, а затем пытаетесь добавить к нему значения в несуществующей ячейке.

Попытка преобразовать в List<int>:

List<int> count = new List<int>(); 

while (reader_SelectedClasses.Read()) 
{ 
    int classId = _class.Class_id = reader_SelectedClasses.GetInt16("class_id"); 
    count.Add(classId); 
} 

Если вам действительно нужен массив из него можно сделать:

int[] countArray = count.ToArray() 
+0

В конце я использовал ответ Dour High Arch, но этот список работал, и я просмотрю свой код. Возможно, я буду использовать List вместо массива. – Pelicer

+0

Ответ Офира и мой могут быть использованы. Если вы не знаете количество классов в 'reader_SelectedClasses' до тех пор, пока вы его не прочитаете, вы должны использовать' List'. –