NullReferenceException
возникает, когда вы пытаетесь получить доступ к ссылочной переменной, которая не ссылается на какой-либо объект. Если ссылочная переменная не ссылается на объект, она будет рассматриваться как null
. Время выполнения сообщит вам, что вы пытаетесь получить доступ к объекту, когда переменная имеет значение null
, создав исключение NullReferenceException
.
Ссылочные переменные в C# и JavaScript по своей концепции аналогичны указателям в C и C++. Типы ссылок по умолчанию имеют значение null
, чтобы указать, что они не ссылаются на какой-либо объект. Следовательно, если вы попытаетесь получить доступ к объекту, на который ссылаются, а его нет, вы получите 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
В этом сообщении об ошибке говорится, что NullReferenceException
произошло в строке 10 файла сценария Example.cs
. Кроме того, в сообщении говорится, что исключение произошло внутри функции Start()
. Это упрощает поиск и исправление исключения нулевой ссылки. В этом примере код такой:
//c# example
using UnityEngine;
using System.Collections;
public class Example : MonoBehaviour {
// Use this for initialization
void Start () {
__GameObject__The fundamental object in Unity scenes, which can represent characters, props, scenery, cameras, waypoints, and more. A GameObject's functionality is defined by the Components attached to it. [More info](class-GameObject)See in [Glossary](Glossary#GameObject) go = GameObject.Find("wibble");
Debug.Log(go.name);
}
}
Код просто ищет игровой объект под названием "wibble". В этом примере нет игрового объекта с таким именем, поэтому функция Find()
возвращает null
. В следующей строке (строка 9) мы используем переменную go
и пытаемся вывести имя игрового объекта, на который она ссылается. Поскольку мы обращаемся к несуществующему игровому объекту, среда выполнения выдает нам NullReferenceException
Нулевые проверки
Хотя это может расстраивать, когда это происходит, это просто означает, что сценарий должен быть более осторожным. Решение в этом простом примере состоит в том, чтобы изменить код следующим образом:
using UnityEngine;
using System.Collections;
public class Example : MonoBehaviour {
void Start () {
GameObject go = GameObject.Find("wibble");
if (go) {
Debug.Log(go.name);
} else {
Debug.Log("No game object called wibble found");
}
}
}
Теперь, прежде чем пытаться что-то делать с переменной go
, мы проверяем, не является ли она null
. Если это null
, мы показываем сообщение.
Попробовать/перехватить блоки
Другой причиной NullReferenceException
является использование переменной, которая должна быть инициализирована в ИнспектореОкно Unity, в котором отображается информация о текущем выбранном игровом объекте, активе или настройках проекта, что позволяет просматривать и редактировать значения. Дополнительная информация
См. в Словарь. Если вы забудете это сделать, переменная будет иметь значение 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
. Блок catch
отображает сообщение, которое может быть более полезным для художников и геймдизайнеров, и напоминает им о необходимости установить свет в инспекторе.
Обзор
-
NullReferenceException
возникает, когда ваш код скрипта пытается использовать переменную, которая не установлена (ссылка) и объект. - Отображаемое сообщение об ошибке многое говорит о том, в каком месте кода возникает проблема.
NullReferenceException
можно избежать, написав код, который проверяетnull
перед доступом к объекту или использует блоки try/catch.