如何在 Unity 中从其他脚本初始化类的数组时修复 NullReferenceException?我无法通过脚本初始化



我有一个可序列化的类,我想在其他脚本中创建它的数组

[Serializable]
public class Question
{
    public string fact;    
}

现在我有另一个类来创建和初始化问题数组。

public class Initialize : MonoBehaviour
{
    Question[] questions;
    void Start()
    {
        questions = new Question[1];
        questions[0].fact = "First Question"; // Here I am getting NullReferenceException
    }
}

另一个值得一提的有趣事情是,当我使用 IEnumerator 初始化相同的数组并在开始时产生返回 null 时,代码按预期工作,这是代码

 public class Initialize : MonoBehaviour
 {
     Question[] questions;
     void Start()
     {
         questions = new Question[1];
         StartCoroutine(InitializeArray());
     }
    IEnumerator InitializeArray()
    {
        yield return null;
        questions[0].fact = "First Question";
    }
}

当我在初始化之前使用 yield 语句时,它可以正常工作,当我再次注释掉 yield 语句时,NullReferenceException 罢工,这怎么可能?

声明引用类型数组时,每个元素都初始化为 null。这就是为什么当您尝试访问其中一个数组元素的属性时会得到 NullReferenceException。

若要避免这种情况,可以使用初始化的引用类型初始化数组:

Question[] questions;
questions = new Question[] 
{
    new Question
    {
        fact = "First Question"
    },
    new Question
    {
        fact = "Second Question"
    }
};

当你打电话时

questions = new Question[1];

您正在实例化一个大小为 1 的空 Question 数组,因此第一个元素将包含 null。要使代码正常工作,您需要使用Question实例填充它,如下所示:

questions = new[] { new Question() };

你的第二个代码片段将出于同样的原因失败;你正在创建一个数组,其中没有Question对象。yield return null提前退出 InitializeArray 方法,这会阻止运行失败的代码。

初始化您自己的自定义类数组的最佳方法:

 public class Initialize : MonoBehaviour
 {
    Question[] questions;
    void Start()
    {
       questions = new Question[2];
       questions[0] = new Question();
       questions[0].fact = "First Question";
       questions[1] = new Question();
       questions[1].fact = "Second Question";
    }
}

如果有多个元素要初始化,我们可以使用循环,就像:

questions = new Question[100];
for (int i = 0; i < questions.Length; i++)
{
    questions[i] = new Question();
    questions[i].fact = "Question Number " + i;
}

最新更新