ArgumentOutOfRangeException - PullRequest
       0

ArgumentOutOfRangeException

4 голосов
/ 15 апреля 2011
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.32_ItI () r в WindowsFormsApplication1.Game.ReturnFire () в D: \ Documents and Settings \ Dima \ Мои документы \ Visual Studio 2008 \ Проекты \ SpaceInvaders \ SpaceInvaders \ SpaceInvadorGame \ Game.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Параметр параметра: индекс"}

Я избавился от исключения, просто сделав это

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

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

но мне все еще любопытно, где было брошено исключение .. хммм

Ответы [ 3 ]

8 голосов
/ 15 апреля 2011

Не делай этого.

Исключения должны быть исключительные .У вас есть все средства, чтобы предотвратить этот исключительный сценарий, и вы абсолютно должны.

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

В первом случае InvadorNumberA может принимать значения от 0 до 4. Проверьте и посмотрите, содержит ли список хотя бы InvadorNumberA + 1 элементов , прежде чем попытается получитьэлемент из этого. не полагайтесь на исключение для исправления вашего курса.Более того, возможно InvadorNumberA следует ограничить random.Next(0, list.Count).Зачем создавать число от 0 до 4, если в списке может быть только 1 или 2 элемента?

2 голосов
/ 15 апреля 2011

Он может быть снова брошен в ваш блок catch, поскольку не гарантируется, что размер списка там будет как минимум 1.

1 голос
/ 15 апреля 2011

Если invadersShooting - пустой список, вы получите исключение в обработчике try.Вы поймаете это исключение в обработчике catch.Однако затем вы еще раз индексируете пустой список и выдается новое исключение, на этот раз в обработчик catch.Это исключение не перехватывается, и у вас есть необработанное исключение.

Просто проверьте invadersShooting.Count, прежде чем пытаться получить элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...