Version: 2017.2
UnityEvents (Eventos de Unity)
Importando Clases

Qué es una Null Reference Exception? (Excepción con Referencia Null)

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

Revisiones de Null

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.

Bloques Try/Catch

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.

Resumen

  • NullReferenceException sucede cuando su código script intenta utilizar una variable que no está configurada (referenciada) y object.
  • El mensaje de error que aparece le dice a usted mucho acerca dónde en el código el problema sucede.
  • NullReferenceException puede ser evitado al escribir código que revise por null antes de acceder un objeto, o utilizar bloques try/catch.
UnityEvents (Eventos de Unity)
Importando Clases