带有For循环的ArrayIndexOutOfBounds

时间:2013-11-15 05:40:16

标签: java android for-loop live-wallpaper indexoutofboundsexception

我正在尝试为动态壁纸创建一个2D正方形阵列(自定义类)。我计算了使用屏幕宽度和高度以及方形边长和它们之间的间隙距离的最终整数可以显示的数量。初始化数组中的方块时,我使用嵌套for循环。但是,当我在模拟器上运行它时,我得到一个超出范围的索引。

  

java.lang.ArrayIndexOutOfBoundsException:length = 6;指数= 6

为什么for循环不起作用?

@Override
public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
    this.width = width;
    this.height = height;

    calcSquares();
    initSquares();

    super.onSurfaceChanged(holder, format, width, height);
}

private void calcSquares()
{
    numSquaresW = width/SQUARE_SIDE;
    numSquaresH = height/SQUARE_SIDE;

    while(width % (numSquaresW * SQUARE_SIDE) < (numSquaresW + 1) * SQUARE_GAP)
            numSquaresW--;
    while(height % (numSquaresH * SQUARE_SIDE) < (numSquaresH + 1) * SQUARE_GAP)
            numSquaresH--;

    marginW = ((width % numSquaresW) - ((numSquaresW - 1) * SQUARE_GAP)) / 2;
    marginH = ((height % numSquaresH) - ((numSquaresH - 1) * SQUARE_GAP)) / 2;

    squares = new WallpaperSquare[numSquaresW][numSquaresH];
}

private void initSquares()
{
    synchronized(squares)
    {
        for(int i=0; i<numSquaresW; i++)
        {
            for(int j=0; j<numSquaresH; i++)
            {
                int color = Color.HSVToColor(new float[] { (float) (360.0 * Math.random()), 1.0f, 1.0f });
                int xLoc = marginW + (SQUARE_SIDE + SQUARE_GAP) * i;
                int yLoc = marginH + (SQUARE_SIDE + SQUARE_GAP) * j;

                squares[i][j] = new WallpaperSquare(xLoc, yLoc, color);
            }
        }
    }
}

4 个答案:

答案 0 :(得分:5)

initSquares内,您有for(int j=0; j<numSquaresH; i++)for的最后一个条款应为j++

答案 1 :(得分:1)

在第二个循环中你应该有

 for(int j=0; j<numSquaresH; j++)  // <-- note the 'j++' and not the 'i++'
        {
            int color = Color.HSVToColor(new float[] { (float) (360.0 * Math.random()), 1.0f, 1.0f });
            int xLoc = marginW + (SQUARE_SIDE + SQUARE_GAP) * i;
            int yLoc = marginH + (SQUARE_SIDE + SQUARE_GAP) * j;

            squares[i][j] = new WallpaperSquare(xLoc, yLoc, color);
        }

取代

 for(int j=0; j<numSquaresH; i++)
        {
            int color = Color.HSVToColor(new float[] { (float) (360.0 * Math.random()), 1.0f, 1.0f });
            int xLoc = marginW + (SQUARE_SIDE + SQUARE_GAP) * i;
            int yLoc = marginH + (SQUARE_SIDE + SQUARE_GAP) * j;

            squares[i][j] = new WallpaperSquare(xLoc, yLoc, color);
        }

答案 2 :(得分:0)

在第二个循环中编写j ++而不是i ++。 。 。 。

答案 3 :(得分:0)

在Inner for循环中尝试放置j++

  for(int j=0; j<numSquaresH; j++)