ArgumentOutofRangeException

本文关键字:ArgumentOutofRangeException | 更新日期: 2023-09-27 17:50:14

Random r = new Random();
        int InvadorNumberA=r.Next(0,5);
        int randomShot = r.Next(5);
        List<Invaders> invadersShooting = new List<Invaders>();
        Invaders invaderA=new Invaders();
        var invaderByLocationX = from invadersSortByLocation in invaders
                                 group invadersSortByLocation by invadersSortByLocation.Location.Y
                                 into invaderGroup
                                 orderby invaderGroup.Key
                                 select invaderGroup;
       invadersShooting = invaderByLocationX.Last().ToList();
     try
       {
           invaderA = invadersShooting[InvadorNumberA];// constantly being thrown there. i cant catch the exception.. so i guess it is being thrown somewhere else. any idea on how i stop it from being thrown?
       }
        catch(ArgumentOutOfRangeException dd)
       {
           invaderA = invadersShooting[0];
       }

堆栈跟踪

" at System.ThrowHelper. "'r'n at System.ThrowHelper.ThrowArgumentOutOfRangeException()'r'n at System.Collections.Generic.List ' 1.使用实例get_Item(Int32 index)'r'n at WindowsFormsApplication1.Game.ReturnFire() in D:'Documents and Settings'Dima'My Documents'Visual Studio 2008'Projects'SpaceInvaders'SpaceInvaders'SpaceInvadorGame'Game.cs:line 444"

目标站点

{空白ThrowArgumentOutOfRangeException(系统。ExceptionArgument System.ExceptionResource)}

更多信息:

{"Index was out of range. Must be non-negative and less than the size of the collection.'r'nParameter name: index"}

{"索引超出范围。必须非负且小于集合的大小。'r'nParameter name: index"}

我通过简单地执行

来摆脱异常
 invadersShooting = invaderByLocationX.Last().ToList();
           invaderA = invadersShooting[r.Next(0,invadersShooting.Count)];

但是我仍然很好奇,在哪里抛出了异常…嗯

ArgumentOutofRangeException

不要这样做。

异常应该是exception 。你有各种办法来防止这种特殊情况,你绝对应该这样做。

invaderA = invadersShooting[InvadorNumberA];
invaderA = invadersShooting[0]; 

在第一种情况下,InvadorNumberA可以是0到4之间的任意值。在尝试从中获取元素之前,检查列表中是否至少有InvadorNumberA + 1个元素。不要依赖一个异常来纠正你的路线。不仅如此,也许InvadorNumberA实际上应该约束于random.Next(0, list.Count)。当列表中可能只有1或2个元素时,为什么要创建一个从0到4的数字?

可以在catch块中再次抛出,因为不能保证列表的大小至少为1。

如果invadersShooting是空列表,您将在try处理程序中抛出异常。您将在catch处理程序中捕获此异常。但是,您随后再次索引到空列表中,并抛出一个新的异常,这次是在catch处理程序中。这个异常没有被捕获,你有一个未处理的异常。

在尝试获取元素之前,只需检查invadersShooting.Count

相关文章:
  • 没有找到相关文章