||Memo|| Ответов: 2

Indexoutofrangeexception: индекс находился вне границ массива -- единство


Привет ребята, я делаю тест игры на движке Unity. Я получаю ошибку типа IndexOutOfRangeException: Index был за пределами массива. Менеджер игр.GetRandomQuestion(). Коды есть:
//Variables
    private List<AnswerData> PickedAnswers = new List<AnswerData>();
    private List<int> FinishedQuestions = new List<int>();
    private int currentQuestion = 0;

//Methods
   Question GetRandomQuestion()
   {
       var randomIndex = GetRandomQuestionIndex();
       currentQuestion = randomIndex;

       return data.Questions[currentQuestion];
   }
   int GetRandomQuestionIndex()
   {
       var random = 0;


       if (FinishedQuestions.Count < data.Questions.Length)
       {
           do
           {
               random = UnityEngine.Random.Range(0, data.Questions.Length);
           } while (FinishedQuestions.Contains(random) || random == currentQuestion);
       }
       return random;


//Data Class

[System.Serializable()]
public class Data
{
    public Question[] Questions = new Question[0];

    public Data(){}

    public static void Write(Data data, string path)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(Data));
        using (Stream stream = new FileStream(path,FileMode.Create))
        {
            serializer.Serialize(stream, data);
        }
    }
    public static Data Fetch(string filePath)
    {
        return Fetch(out bool result,filePath);
    }
    public static Data Fetch(out bool result, string filePath)
    {
        if (File.Exists(filePath)) 
        {
            result = false;
            return new Data();
        }
        XmlSerializer deserializer = new XmlSerializer(typeof(Data));
        using (Stream stream = new FileStream(filePath, FileMode.Open))
        {
            var data = (Data)deserializer.Deserialize(stream);

            result = true;
            return data;
        }
    }
}


Что я уже пробовал:

Я не мог найти, где индекс выходит за пределы диапазона. Поэтому я ничего не мог сделать, кроме как поискать его в google.

2 Ответов

Рейтинг:
18

Patrice T

Цитата:
Я получаю ошибку типа IndexOutOfRangeException: Index был за пределами массива.

Полное сообщение об ошибке также сообщает вам положение ошибки, это хорошая идея, чтобы сказать нам тоже.
Независимо от того, где находится ошибка, ваш код пытается прочитать/записать элемент массива, который не существует. Один инструмент может помочь вам понять, что не так, это отладчик.

Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

Отладка кода C# в Visual Studio - YouTube[^]

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


CPallini

5.

Patrice T

Спасибо

||Memo||

Я знал, что означает Код ошибки. Я использовал отладчик так много раз, и я обнаружил, что из-за метода Fetch не могу найти путь к файлу JSON. Спасибо за ответ и ваше терпение.

Рейтинг:
1

OriginalGriff

Посмотрите на свой код:

public class Data
{
    public Question[] Questions = new Question[0];

Question GetRandomQuestion()
{
    var randomIndex = GetRandomQuestionIndex();
    currentQuestion = randomIndex;

    return data.Questions[currentQuestion];
}
Потому что Questions объявляется как массив с нулевой длиной и никогда не изменяется, любое значение индекса - включая ноль - будет вне диапазона: нет никаких элементов вообще для доступа!

В будущем используйте отладчик: он покажет вам, где и в чем заключается эта проблема, гораздо быстрее и проще, чем размещение вопроса здесь!


Richard MacCutchan

"В будущем используйте отладчик"
Или <отец Тед голос&ГТ;"просто прочитать код, черт возьми, Дугал."&ЛТ;/отец Тед голос&ГТ;

CPallini

5.