版本:2022.3
语言:英语
Unity事件
重要类

空引用异常

当你尝试访问一个没有引用任何对象的引用变量时,会发生 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 块。
Unity事件
重要类