ArgumentOutofRangeException

|
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];
       }
堆栈跟踪   \“在System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument参数,ExceptionResource资源)在System.ThrowHelper.ThrowArgumentOutOfRangeException()\\ r \\ n在System.Collections.Generic.List`1.get_Item(Int32索引) )\\ r \\ n在D:\\ Documents and Settings \\ Dima \\ My Documents \\ Visual Studio 2008 \\ Projects \\ SpaceInvaders \\ SpaceInvaders \\ SpaceInvadorGame \\ Game中的WindowsFormsApplication1.Game.ReturnFire() .cs:第444行\“ 目标地点   {Void ThrowArgumentOutOfRangeException(System.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 \\ n参数名称:index \”} 我只是通过这样做摆脱了异常
 invadersShooting = invaderByLocationX.Last().ToList();

           invaderA = invadersShooting[r.Next(0,invadersShooting.Count)];
但是我还是很好奇,关于抛出异常的地方。     
已邀请:
不要这样做。 例外应该是例外。您有一切手段来防止这种异常情况,您绝对应该这样做。
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
。     

要回复问题请先登录注册