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 esta sub-lección
- 01Distinguir null de una cadena vacía y de un cero.
- 02Reconocer las tres operaciones que hacen saltar un NullPointerException.
- 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 PREGUNTA | null | '' | ' ' |
|---|
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.
| Valor | Significa | length() devuelve |
|---|---|---|
| null | Nunca se rellenó. | NullPointerException |
| '' | Se rellenó con nada. | 0 |
| ' ' | Se rellenó con espacios. | 3 |
| 0 | Se 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.
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.
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 nullComprobar 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.
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 contrarioLa nutria: Ya escribiste esto en una fórmula
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 .
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