【问题标题】:Why does this for loop run into an ArrayIndexOtOfBounds error? (Java)为什么这个 for 循环会遇到 ArrayIndexOtOfBounds 错误? (爪哇)
【发布时间】:2019-10-31 12:43:39
【问题描述】:

我想要做的是让我的代码将整数转换为基数 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

感谢您的宝贵时间!

【问题讨论】:

    标签: java data-conversion radix


    【解决方案1】:

    在 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&lt;size 在启动 for 循环时),或者改用 while 循环。

    【讨论】:

      【解决方案2】:

      因为它在while (remainder &gt; 0) 循环中使用和增加a,而无需检查以确保a 仍然是&lt; 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
      

      【讨论】:

        猜你喜欢
        • 2012-04-01
        • 2011-08-18
        • 2015-11-25
        • 1970-01-01
        • 2020-10-05
        • 1970-01-01
        • 2022-07-06
        • 1970-01-01
        • 2018-04-07
        相关资源
        最近更新 更多