【问题标题】:How to fix NullReferenceException when initializing array of a class from other script in unity? I am not able to initialize array through script统一从其他脚本初始化类数组时如何修复NullReferenceException?我无法通过脚本初始化数组
【发布时间】:2019-01-06 20:33:00
【问题描述】:

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

[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 初始化相同的数组并在开始时产生 return 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,这怎么可能?

【问题讨论】:

标签: c# arrays unity3d


【解决方案1】:

declare a reference type array 时,每个元素都被初始化为 null。这就是当您尝试访问其中一个数组元素的属性时收到 NullReferenceException 的原因。

为避免这种情况,您可以使用已初始化的引用类型(S)来初始化数组:

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

【讨论】:

  • 你能指定我将如何初始化一个包含 2 个元素的数组吗,你的代码不工作。你能给我代码来初始化两个元素的数组吗?
  • @JunedKhanMomin 我更新了答案以包含一个使用多个元素初始化数组的示例
  • 这个行得通,谢谢,是不是有一些简单的方法可以做到这一点,对于大数组,这将是一种非常繁琐的初始化数组的方法。
  • questions[0]=new Question(); 如果你有一个更大的数组,你可以使用循环来初始化它:for(int i=0; i<questions.Length; ++i) questions[i] = new Question();
  • @pinkfloydx33,您无需发表评论。已被接受的答案请参见此处:stackoverflow.com/a/54072338/8304176
【解决方案2】:

当你打电话时

questions = new Question[1];

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

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

你的第二个代码 sn-p 会因为同样的原因而失败;您正在创建一个没有 Question 对象的数组。 yield return null 将提前退出 InitializeArray 方法,从而停止运行失败的代码。

【讨论】:

    【解决方案3】:

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

     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;
    }
    

    【讨论】:

    • @devNull,这是我找到的最简单的方法。
    猜你喜欢
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    相关资源
    最近更新 更多