Una NullReferenceException
sucede cuando usted intenta acceder una variable de referencia que no está referenciando ningún objeto. Si una variable de referencia no está referenciando un objeto, entonces será tratada como null
. El tiempo de ejecución le va a decir a usted que usted está intentando acceder un objeto, cuando la variable es null
al emitir una NullReferenceException
.
Variables referenciadas en C# y JavaScript son similares en concepto a apuntadores en C y C++. Los tipos de referencia por defecto son null
para indicar que no están referenciando a ningún objeto. Por lo tanto, si usted intenta y accede a un objeto que está referenciado y no hay un objeto, usted obtendrá una NullReferenceException
.
Cuando usted obtiene una NullReferenceException
en su código significa que usted ha olvido configurar una variable antes de utilizarla. El mensaje de error se verá algo así:
NullReferenceException: Referencia al objeto no está establecida como instancia de un objeto
en Example.Start () [0x0000b] in /Unity/projects/nre/Assets/Example.cs:10
Este mensaje de error dice que una NullReferenceException
sucede en la linea 10 del archivo script Example.cs
. También, el mensaje dice que la excepción sucede dentro de la función Start()
. Esto hace que la Null Reference Exception fácil de encontrar y arreglar. En este ejemplo, el código es:
//Ejemplo c#
using UnityEngine;
using System.Collections;
public class Example : MonoBehaviour {
// Use esto para la inicialización
void Start () {
GameObject go = GameObject.Find("wibble");
Debug.Log(go.name);
}
}
El código simplemente busca un game object llamado “wibble”. En este ejemplo no hay game object con ese nombre, por lo que la función Find()
devuelve null
. En la siguiente linea (Linea 9) nosotros utilizamos la variable go
e intentamos e imprimimos el nombre del game object el cual referencia. Debido a que estamos accediendo un game object que no existe, el tiempo de ejecución nos da una NullReferenceException
Aunque puede ser frustrante cuando esto pase, esto solo significa que el script necesita ser más cuidados. La solución en este ejemplo sencillo es cambiar el código a algo así:
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");
}
}
}
Ahora, antes de que intentemos hacer algo con la variable go
, nosotros revisamos que no esté null
. Si es null
, entonces nosotros mostramos un mensaje.
Otra causa para NullReferenceException
es utilizar una variable que debería ser inicializada en el Inspector. Si usted se le olvida hacer esto, entonces la variable será null
. Una manera diferente de solucionar la NullReferenceException
son los bloques try/catch. Por ejemplo, este código:
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");
}
}
}
En este ejemplo de código, la variable llamada myLight
es una Light
que debería ser configurada en la ventana del Inspector. Si esta variable no es configurada, entonces va por defecto a ser null
. Intentar cambiar el color de la luz en el bloque try
va a causar una NullReferenceException
que es recogida por el bloque catch
. El bloque catch
muestra un mensaje que podría ser de gran ayuda a artistas y diseñadores de juego, y les recuerda configurar las luces en el inspector.
NullReferenceException
sucede cuando su código script intenta utilizar una variable que no está configurada (referenciada) y object.NullReferenceException
puede ser evitado al escribir código que revise por null
antes de acceder un objeto, o utilizar bloques try/catch.