当你尝试访问一个没有引用任何对象的引用变量时,会发生 NullReferenceException
。当你尝试访问一个没有引用对象的引用变量时,引用类型默认为 null
,Unity会返回一个 NullReferenceException
。
如果你的代码中出现 NullReferenceException
,这意味着你在使用变量之前忘记了设置它。错误消息看起来可能像这样
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 go = GameObject.Find("exampleGameObject");
Debug.Log(go.name);
}
}
代码寻找一个名为“exampleGameObject”的 GameObject在Unity场景中代表角色、道具、风景、照相机、航点等等的基本对象。GameObject的功能由附加到其上的组件定义。 更多信息
在术语表中查看。在这个例子中,没有名为该名称的GameObject,因此 Find()
函数返回 null
。在下一条语句(第9行)中,脚本使用 go
变量来打印出引用的GameObject的名称。因为它尝试访问一个不存在的GameObject,所以Unity返回一个 NullReferenceException
在这个例子中的解决方案是包括在给定的名称的GameObject不存在的情况下的结果。以下脚本检查 go
变量是否返回 null
,如果是,则显示一条消息
using UnityEngine;
using System.Collections;
public class Example : MonoBehaviour {
void Start () {
GameObject go = GameObject.Find("exampleGameObject");
if (go) {
Debug.Log(go.name);
} else {
Debug.Log("No GameObject called exampleGameObject found");
}
}
}
如果未在 检查器一个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
。如果没有设置它,则默认为 null
。
在 try
块中尝试更改灯光颜色会导致 NullReferenceException
。如果发生这种情况,catch
块代码将显示一条消息,提醒你在检查器中设置灯光。
NullReferenceException
。NullReferenceException
,编写在访问GameObject之前检查 null
的代码,或者使用 try
/catch
块。