NullReferenceException при попытке получить List.Count
Описание
У меня есть небольшой скрипт.
Этот скрипт создаёт локальную базу данных и имеет некоторые основные части такие как -
1. Список Students.Data, в котором все данные о студентах.
2. Функция Students.Save(), который сохраняет список Students.Data в памяти устройства.
3. Функция Students.Load(), который загружает данные и присваивает их списку Students.Data.
4. Функция RefreshStudentsList(), который обновляет список студентов показанных на экране.
Проблема у меня в том что при вызове функции RefreshStudentsList() получаю ошибку NullReferenceException в строке for (int i = 0; i < Students.Data.Count; i++) видимо потому что Students.Data.Count равен null. Попробовал исправить всеми возможными способами человечества. Ошибка исчезает если первый раз запускаем программу, а если уже есть сохранённые данные, то появляется.
Скрипт
using System.Collections.Generic;
using UnityEngine;
public class Global: MonoBehaviour
{
private class Container
{
public List<Student> Students;
public Container(List<Student> Input)
{
Students = Input;
}
}
private void Awake()
{
Students.Load();
StudentsPrefab = NonStaticStudentsPrefab;
}
//------------------------------ start of Student ------------------------------
public class Student
{
public string Name, Surname, About;
public int Sex;
}
public static class Students
{
public static List<Student> Data = new List<Student>(); //Список студентов
public static void Save() //Сохранение
{
PlayerPrefs.SetString("Students", JsonUtility.ToJson(new Container(Data)));
}
public static void Load() //Загрузка
{
if (!PlayerPrefs.HasKey("Students"))
{
Data = new List<Student>();
}
else
{
Data = JsonUtility.FromJson<Container>(PlayerPrefs.GetString("Students")).Students;
}
}
}
public GameObject NonStaticStudentsPrefab;
static GameObject StudentsPrefab;
public static void RefreshStudentsList() //Обновление
{
GameObject StudentsParent = Functions.Find("Content (Students)");
for (int i = 0; i < StudentsParent.transform.childCount; i++)
{
Destroy(StudentsParent.transform.GetChild(i).gameObject);
}
for (int i = 0; i < Students.Data.Count; i++)
{
GameObject StudentCopy = Instantiate(StudentsPrefab, StudentsParent.transform);
}
}
//------------------------------ end of Student ------------------------------
}
Вопрос
Почему после загрузки постоянно появляется эта ошибка и как можно это исправить?
Ответы (1 шт):
видимо потому что
Students.Data.Countравен null.
→ Students.Data - равно null. А null мы получаем потому что данные не сохраняются. Чтобы сохранение прошло успешно надо сериализовать класс Student.
Исправленный код выглядит таким →
using System;
...
[Serializable]
public class Student
{
public string Name, Surname, About;
public int Sex;
}
...
public static void Load() //Загрузка
{
if (!PlayerPrefs.HasKey("Students"))
{
Data = new List<Student>();
}
else
{
Data = JsonUtility.FromJson<Container(PlayerPrefs.GetString("Students")).Students;
if (Data == null)
Data = new List<Student>();
}
}