Почему в цикле возникает ошибка ArrayIndexOtOfBounds? (Ява) - PullRequest
1 голос
/ 31 октября 2019

Я пытаюсь сделать так, чтобы мой код преобразовал целые числа в основание 2, а затем превратил эти значения в элементы в строковом массиве. Я пытаюсь избежать использования Integer.toBinary (). Если бы я мог получить некоторую помощь, это было бы невероятно полезно.

public String[] streamChars(int[] colAvgs)
{
 String avgString = Arrays.toString(colAvgs);
 String convBases[] = avgString.split(",");
 int remainder;
 for (int a =0;a<colAvgs.length;a++)
 {
  remainder = colAvgs[a];
   while(remainder>0)
    {
     remainder = remainder%2;
     if ((remainder%2)==0|| (remainder%2)==1)
      {
       convbases[a] = Integer.toString(remainder);
       a++;
      }//end if
    }//end while
 }//end for
return convbases;
}//end streamChars

Спасибо за ваше время!

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Ваш остаток не будет равен 0, пока a не достигнет значения colAvgs, и после этого попытка доступа к convbases [a] завершится сбоем.

Ваше время должно учитывать, что a не может быть выше илиравно чем colAvgs.

int size = colAvgs.length;
for (int a =0;a<size;a++)
 {
  remainder = colAvgs[a];
   while(remainder>0 && a<size)
    {
     remainder = remainder%2;
     if ((remainder%2)==0|| (remainder%2)==1)
      {
       convbases[a] = Integer.toString(remainder);
       a++;
      }//end if
    }//end while
 }//end for
if(remainder>0) //you know it finished due to a being too big.
else //this is what you want to happen

Однако я думаю, что важно отметить, что хорошей практикой является не изменять циклическую переменную внутри цикла for, поскольку это является частью работы for. Вы не должны делать a++ внутри цикла while. Вы используете цикл for, когда точно знаете количество итераций, которые цикл будет выполнять. У вас нет этой информации здесь. Таким образом, вы должны либо изменить условие цикла (в данном случае a<size при запуске цикла for), либо использовать вместо него цикл while.

0 голосов
/ 31 октября 2019

Поскольку он использует и увеличивает a в цикле while (remainder > 0), не проверяя, чтобы a оставался < convbases.length. (Кстати, convbases в одном месте, но convBases в другом, что должно препятствовать компиляции этого кода; Java чувствительна к регистру.)

public String[] streamChars(int[] colAvgs)
{
 String avgString = Arrays.toString(colAvgs);
 String convBases[] = avgString.split(",");
 int remainder;
 for (int a =0;a<colAvgs.length;a++)
 {
  remainder = colAvgs[a];
   while(remainder>0)
    {
     remainder = remainder%2;
     if ((remainder%2)==0|| (remainder%2)==1)
      {
       convbases[a] = Integer.toString(remainder);
//     ^^^^^^^^^^^^------------------------------------- using it
       a++;
//     ^^^^--------------------------------------------- incrementing it
      }//end if
    }//end while
 }//end for
return convbases;
}//end streamChars
...