Apex Academy
Módulo 1·06·24 min

Null

El campo en blanco, llevado al código. Es la causa número uno de errores en Apex y la más fácil de evitar.

En Admin esUn campo en blanco, ISBLANK() y BLANKVALUE()

✓ En esta sub-lección

  1. 01Distinguir null de una cadena vacía y de un cero.
  2. 02Reconocer las tres operaciones que hacen saltar un NullPointerException.
  3. 03Comprobar la ausencia de un dato antes de usarlo, con la herramienta adecuada a cada tipo.

La nutria: ¿Te acuerdas? · Repaso de la lección 5

En newLead.Company.trim(), ¿qué es Company?

Abre cualquier lista de Leads de tu org y mira la columna de teléfono: habrá filas en blanco. Ese blanco tiene nombre en Apex (null) y, a diferencia de la interfaz, aquí no se ignora educadamente: si intentas usarlo, la entera se detiene.

Tres cosas que no son lo mismo

Esto ya lo sabías como Admin, aunque quizá sin ponerle nombre: no es lo mismo un campo que nadie ha rellenado, un campo rellenado con nada, y un campo rellenado con cero. En un informe, los tres se ven casi igual. En Apex se comportan de forma muy distinta.

LA PREGUNTAnull''' '

Paso 1 de 5

Tres cosas que parecen lo mismo en la pantalla y no lo son: un campo que nunca se rellenó (null), uno que se rellenó con nada ('') y uno con espacios (' '). Vamos a preguntarle a cada uno lo mismo.

null no es un valor pequeño: es la ausencia de valor. Por eso no se le puede pedir nada.
ValorSignificalength() devuelve
nullNunca se rellenó.NullPointerException
''Se rellenó con nada.0
' 'Se rellenó con espacios.3
0Se midió y salió cero.No aplica (no es texto)

Todo empieza en null

Una variable declarada y no asignada vale null, sea del tipo que sea. Un campo vacío leído de la base de datos también llega como null. Y un Boolean sin asignar no es false: es null, que es un tercer estado.

Apex
Integer contactCount;      // null, no 0
String region;             // null, no ''
Boolean isActive;          // null, no false

Lead webLead = new Lead(LastName = 'Ruiz');
System.debug(webLead.Company);   // null: nunca se asignó

Las tres formas de romperlo

El error se llama NullPointerException y siempre dice lo mismo: «Attempt to de-reference a null object». Traducido: le has pedido algo a algo que no existe. Ocurre en tres situaciones, y las tres se reconocen a simple vista.

Apex
String region = null;
Integer count = null;
Account account = null;

region.toUpperCase();      // 1. llamar a un método sobre null
Integer total = count + 5; // 2. operar aritméticamente con null
String name = account.Name;// 3. leer un campo de un registro null
Las tres fallan en ejecución, no al compilar: el compilador no sabe qué valdrá la variable.

Comprobar antes de usar

La comprobación básica sirve para cualquier tipo: comparar con null usando == o !=. Para texto hay algo mejor, porque el problema real casi nunca es solo null: también son un problema la cadena vacía y la cadena de espacios.

Apex
String region = webLead.Region__c;

Boolean exists = region != null;          // vale para cualquier tipo
Boolean usable = String.isNotBlank(region); // null, '' y '   ' de una vez
Boolean missing = String.isBlank(region);   // lo contrario
String.isBlank() es la comprobación que resuelve el 90 % de los casos reales con datos de formularios.

La nutria: Ya escribiste esto en una fórmula

Yo ya escribía esto en fórmulas: ISBLANK(Region__c) y BLANKVALUE(Region__c, 'Sin región') son exactamente la misma idea: comprobar el hueco antes de usarlo y decidir qué poner si está vacío. Apex te obliga a hacerlo explícito, pero la lógica es la que ya aplicabas.

El operador de navegación segura

Cuando solo quieres leer algo y te da igual que no exista, existe una forma corta: escribir ?. en lugar del punto. Si lo de la izquierda es null, la expresión entera vale null y no se lanza ninguna .

Apex
String region = null;

String loud = region.toUpperCase();    // 💥 NullPointerException
String safe = region?.toUpperCase();   // null, sin explotar

Account account = null;
String name = account?.Name;           // null, sin explotar