?.) in Salesforce Apex evaluates the left-hand side of an expression. If that value is null, it immediately returns null instead of throwing a dreaded System.NullPointerException (NPE).
Null pointer exceptions are among the most common run-time errors in Apex development. Traditionally, guarding against them required writing layers of verbose if (variable != null) checks. The safe navigation operator streamlines your code by letting you chain references and method calls safely on a single line.
Before vs. After: Cleaner Apex Syntax
Consider a scenario where you want to retrieve a URL from a user record and convert it to an external string form:
String profileUrl = null;
if (user.getProfileUrl() != null) {
profileUrl = user.getProfileUrl().toExternalForm();
}
String profileUrl = user.getProfileUrl()?.toExternalForm();
Instead of declaring variables early and nesting logic in multiple blocks, the entire evaluation reduces to one clear, readable statement.
Common Use Cases in Salesforce Development
- Traversing SOQL Relationships: Access parent and related field data without separate null checks for parent objects:
// Safely access deep parent fields String accountCity = contact.Account?.BillingCity; - Method Chaining: Call subsequent helper methods only when the initial method returns an instantiated object:
String cleanName = lead.Company?.trim()?.toUpperCase(); - Map and Collection Lookups: Chain operations directly from map lookups:
Integer accountEmployees = accountMap.get(accId)?.NumberOfEmployees;
null if the reference is empty. If you assign the result to a primitive type (like a non-nullable Boolean or Integer) in conditional expressions without handling null, you can still encounter runtime errors. Ensure downstream logic anticipates a potential null assignment.
- Syntax:
object?.fieldOrMethod() - NPE Prevention: Automatically bypasses execution when encountering null references.
- Code Quality: Significantly reduces cyclomatic complexity and line counts across business logic and triggers.
- Test Coverage: Fewer branching
ifblocks means cleaner, more maintainable test classes.
?.) across your Apex classes to eliminate boilerplate null checks, write readable chained queries, and safeguard your applications against NullPointerExceptions.
Comments
Questions, corrections and your own experience are all welcome.
Post a Comment