为2D数组调用Array.GetLength(1)时的C#IndexOutOfRangeException

时间:2013-11-18 14:45:59

标签: c# arrays multidimensional-array

这是代码, 我注意到Getlength方法返回0,但我认为正常,因为for循环不会超过0 .. 我写过

int yy = tile.GetLength(1); 

并抛出与以下代码相同的异常:

 TileData[][] tile = GameMain.Level.getCollisionTiles();

        Rectangle tileRectangle;
        for(int x = 0; x <= tile.GetLength(0); x++)
        {
            for (int y = 0; y <= tile.GetLength(1); y++) //EXCEPTION THROWN HERE AT GETLENGTH !!!!
            {
                tileRectangle = tile[x][y].Target;
                if (tileRectangle.Contains(m_hitbox)) //Si il y a collision
                {
                    if ((m_hitbox.X + m_hitbox.Width) > tileRectangle.X) //si le joueur percute par la gauche
                    {
                        m_hitbox.X--;
                    }
                    else if (m_hitbox.X < (tileRectangle.X + tileRectangle.Width)) //Droite
                    {
                        m_hitbox.X++;
                    }
                    if ((m_hitbox.Y + m_hitbox.Height) > tileRectangle.Y) //si le joueur percute par le haut
                    {
                        m_hitbox.Y--;
                    }
                    else if (m_hitbox.Y < (tileRectangle.Y + tileRectangle.Height)) //Bas
                    {
                        m_hitbox.Y++;
                    }
                }
            }
        }
编辑:我通过从地图对象获取tile信息来实现它,但现在它抛出了NullReferenceException

        TileData[][] tile = GameMain.Level.getCollisionTiles();
        int xMax = GameMain.Level.getMapHeight();
        int yMax = GameMain.Level.getMapWidth();

        for (int x = 0; x <= xMax; x++)
        {
            for (int y = 0; y <= yMax; y++)
            {
                Rectangle tileRectangle = tile[x][y].Target; //THIS LINE FAILS !!!!
                if (tileRectangle.Contains(m_hitbox)) //Si il y a collision
                {
                    if ((m_hitbox.X + m_hitbox.Width) > tileRectangle.X) //si le joueur percute par la gauche
                    {
                        m_hitbox.X--;
                    }
                    else if (m_hitbox.X < (tileRectangle.X + tileRectangle.Width)) //Droite
                    {
                        m_hitbox.X++;
                    }
                    if ((m_hitbox.Y + m_hitbox.Height) > tileRectangle.Y) //si le joueur percute par le haut
                    {
                        m_hitbox.Y--;
                    }
                    else if (m_hitbox.Y < (tileRectangle.Y + tileRectangle.Height)) //Bas
                    {
                        m_hitbox.Y++;
                    }
                }
            }
        }

很抱歉在同一主题中问你这个问题,但我认为你可以帮助我快速解决它。

1 个答案:

答案 0 :(得分:5)

这不是2D阵列。 TileData[][]是一个锯齿状数组,TileData[,]是一个2D数组,在您的情况下,GetLength(1)将始终失败,因为tile只有一个维度。

修改
该怎么做才能解决这个问题?您可以将[] []更改为[,](例如)并保持其他所有内容(getCollisionTiles()如何工作?)或者您可以更新代码以从锯齿状数组中获得正确的大小,如下所示:

for (int y = 0; y < tile[x].GetLength(0); y++)

顺便说一下,你甚至可以用简单的GetLength(0)替换Length

for(int x = 0; x < tile.Length; x++)
{
    for (int y = 0; y < tile[x].Length; y++)

最后注意事项:对于基于0的数组,索引的长度不包括在内,因此x <= tile.Length必须替换为x < tile.Length