ArgumentOutofRangeException

时间:2011-04-15 17:53:51

标签: c# exception-handling arguments

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资源)\ r \ n在System.ThrowHelper.ThrowArgumentOutOfRangeException()\ r \ n在System.Collections.Generic.List`1.get_Item(Int32 index)\ r:n位于D:\ Documents and Settings \ Dima \ My Documents \ Visual Studio 2008 \ Projects \ SpaceInvaders \ SpaceInvaders \ SpaceInvadorGame \ Game.cs中的WindowsFormsApplication1.Game.ReturnFire():第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 \ nParameter name:index”}

我通过简单地执行此操作摆脱了异常

 invadersShooting = invaderByLocationX.Last().ToList();

           invaderA = invadersShooting[r.Next(0,invadersShooting.Count)];

但我仍然很好奇,在那里抛出了异常......嗯......

3 个答案:

答案 0 :(得分:8)

不要这样做。

例外应该例外。你有办法防止这种特殊情况,你绝对应该这样做。

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

在第一种情况下,InvadorNumberA可以是0到4之间的任何内容。在尝试获取之前,检查并查看列表中是否至少包含InvadorNumberA + 1个元素它的元素。 依赖异常来纠正您的课程。不仅如此,InvadorNumberA实际上应该被限制在random.Next(0, list.Count)。为什么在列表中可能只有1个或2个元素时创建一个从0到4的数字?

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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