在 C# 中,当您尝试访问值为 null
的类型的成员时,就会发生 NullReferenceException
。运行时出现的 NullReferenceException
通常意味着您忘记在使用对象引用变量之前对其进行初始化。有关产生空引用的常见编码错误的完整说明,请参阅Microsoft 文档。
空引用错误消息类似于
NullReferenceException: Object reference not set to an instance of an object
at Example.Start () [0x0000b] in /Unity/projects/nre/Assets/Example.cs:10
此错误消息表明在脚本文件 Example.cs
的第 10 行发生了 NullReferenceException
,并且异常发生在 Start()
函数内部。这使得空引用异常易于查找和修复。在此示例中,代码为
using UnityEngine;
using System.Collections;
public class Example : MonoBehaviour {
// Use this for initialization
void Start () {
GameObject myGameObject = GameObject.Find("exampleGameObject");
Debug.Log(myGameObject.name);
}
}
代码查找名为“exampleGameObject”的GameObjectUnity 场景中的基本对象,可以表示角色、道具、场景、摄像机、路点等。GameObject 的功能由附加到它的组件定义。 更多信息
参见 术语表。在此示例中,没有名为该名称的 GameObject,因此 Find()
函数返回 null
。在下一行(第 9 行),脚本使用 myGameObject
变量打印出它引用的 GameObject 的名称。由于它试图访问不存在的 GameObject,因此 Unity 返回 NullReferenceException
在此示例中的解决方案是在给定名称的 GameObject 不存在的情况下包含一个结果。以下脚本检查 go
变量是否返回 null
,如果返回则显示一条消息
using UnityEngine;
using System.Collections;
public class Example : MonoBehaviour {
void Start () {
GameObject myGameObject = GameObject.Find("exampleGameObject");
if (myGameObject == null) {
Debug.Log("No GameObject called exampleGameObject found");
} else {
Debug.Log(myGameObject.name);
}
}
}
对于继承自 UnityEngine.Object 的类型,Unity 使用 C# 相等和不等运算符 的自定义版本。这意味着先前示例中的空值检查(myGameObject == null
)即使 myGameObject
在技术上持有有效的 C# 对象引用,也可以评估为 true
(反之,myGameObject != null
可以评估为 false
)。这发生在两种情况下
如果您使用需要在Inspector一个 Unity 窗口,显示有关当前选定的 GameObject、资源或项目设置的信息,允许您检查和编辑值。 更多信息
参见 术语表窗口中初始化的变量,Unity 也会调用 NullReferenceException
。如果您忘记执行此操作,则该变量为 null
。处理 NullReferenceException
的另一种方法是使用 try
/catch
块。例如
using UnityEngine;
using System;
using System.Collections;
public class Example2 : MonoBehaviour {
public Light myLight; // set in the inspector
void Start () {
try {
myLight.color = Color.yellow;
}
catch (NullReferenceException ex) {
Debug.Log("myLight was not set in the inspector");
}
}
}
在此代码示例中,名为 myLight
的变量是一个 Light
,您需要在 Inspector 窗口中设置它。如果未设置此变量,则默认为 null
。
尝试在 try
块中更改灯光颜色会导致 NullReferenceException
。如果发生这种情况,catch
块代码将显示一条消息,提醒您在 Inspector 中设置灯光。