Use the Safe Navigation Operator to Avoid Null Pointer Exceptions
Use the safe navigation operator (?.) to replace explicit, sequential checks for null references. This new
operator short-circuits expressions that attempt to operate on a null value and returns
null instead of throwing a NullPointerException.
Where: This change applies to Lightning Experience and Salesforce Classic in Enterprise, Performance, Unlimited, and Developer editions.
How: If the left-hand-side of the chain expression evaluates to null, the right-hand-side is not evaluated. Use the safe navigation operator (?.) in method, variable, and property chaining. The part of the expression that is not evaluated can include variable references, method references, or array expressions.
Example
- This example first evaluates a, and
returns null if a is null. Otherwise,
the return value is a.b.
a?.b // Evaluates to: a == null? Null : a.b
- This example returns null if a[x]
evaluates to null. If a[x] does not
evaluate to null and aMethod() returns
null, then this expression throws a null pointer
exception.
a[x]?.aMethod().aField // Evaluates to null if a[x] == null
- This example returns null if a[x].aMethod() evaluates to null.
a[x].aMethod()?.aField
- This example indicates that the type of the expression is the same, whether the
safe navigation operator is used in the expression or
not.
Integer x = anObject?.anIntegerField; // The expression is of type Integer because the field is of type Integer
- This example shows a single statement replacing a block of code that checks for
nulls.
// Previous code checking for nulls String profileUrl = null; if (user.getProfileUrl() != null) { profileUrl = user.getProfileUrl().toExternalForm(); }
// New code using the safe navigation operator String profileUrl = user.getProfileUrl()?.toExternalForm();
- This example shows a single-row SOQL query using the safe navigation operator.
// Previous code checking for nulls results = [SELECT Name FROM Account WHERE Id = :accId]; if (results.size() == 0) { // Account was deleted return null; } return results[0].Name;
// New code using the safe navigation operator return [SELECT Name FROM Account WHERE Id = :accId]?.Name;