为什么这个 for loop 运行 会变成 ArrayIndexOtOfBounds 错误? (Java)
Why does this for loop run into an ArrayIndexOtOfBounds error? (Java)
我想要做的是让我的代码将整数转换为基数 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
感谢您的宝贵时间!
因为它在 while (remainder > 0)
循环中使用和增加了 a
,而没有检查以确保 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
在 a 达到 colAvgs 值之前,您的余数不会变为 0,之后,尝试访问 convbases[a] 会崩溃。
你的 while 应该考虑到 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 工作的一部分。你不应该在 while 循环中执行 a++
。当您确切知道循环将 运行 的迭代次数时,您可以使用 for 循环。你这里没有这些信息。因此,您应该更改循环条件(在本例中 a<size
启动 for 循环时),或者改用 while 循环。
我想要做的是让我的代码将整数转换为基数 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
感谢您的宝贵时间!
因为它在 while (remainder > 0)
循环中使用和增加了 a
,而没有检查以确保 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
在 a 达到 colAvgs 值之前,您的余数不会变为 0,之后,尝试访问 convbases[a] 会崩溃。
你的 while 应该考虑到 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 工作的一部分。你不应该在 while 循环中执行 a++
。当您确切知道循环将 运行 的迭代次数时,您可以使用 for 循环。你这里没有这些信息。因此,您应该更改循环条件(在本例中 a<size
启动 for 循环时),或者改用 while 循环。