Groovy

Avoid NullPointerException: Safe Navigation with Groovy

We know it’s all too common in Java to get a NullPointerException when we use an object reference which is null. This happens when our code tries to access a method or field of an object, or element of an array when there’s no instance present – e.g. it refers to null.

class Animal {
 String name
 Animal parent
}

def animal = new Animal(name: "Bella") // no parent

We might get an Animal instance from the outside and we need to get the name of the parent.

def parentName = animal.parent.name
// BLAM! java.lang.NullPointerException: 
// Cannot get property 'name' on null object

Parent is null. Usually as a precaution we have to check for null beforehand.

if (animal.parent != null) {
 def parentName = animal.parent.name
}

You can see that if we need the name of the grandparent, there are even more references which could be null.

def grandParentName = animal.parent.parent.name

We need a safe way to navigate through references we might expect to be null. Fortunately, with Groovy this is very easy. Use the Safe Navigation (or null-safe) operator which guards against NullPointerExceptions. This is just a question mark (?) before the dot (.)

animal?.name

A small little gem, but a great feature of Groovy.

// instead of checking for nulls the Java way
if (animal.parent != null && animal.parent.parent != null) {
 def grandParentName = animal.parent.parent.name
}

// or using the Groovy truth
if (animal.parent && animal.parent.parent) {
 def grandParentName = animal.parent.parent.name
}

// use safe navigation
def grandParentName = animal.parent?.parent?.name

// and in combination with Elvis
grandParentName = animal.parent?.parent?.name ?: "Unknown"

Ted Vinke

Ted is a Java software engineer with a passion for Web development and JVM languages and works for First8, a Java Web development company in the Netherlands.
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments
Back to top button