The Safe Navigation Operator (?.) is used to avoid a NullPointerException. This operator should be used when we have a reference to an object which is needed to be verified for not being null before accessing its methods or properties:
def obj = .....
def x =obj.?aMethod()
def y = obj.?aPropty The
safe navigation operator will simply return null if the reference object is null instead of throwing an
NullPointerException. So In above example if obj is null, no
NullPointerException will be thrown and x and y will be assigned to null.
Example
A Java class
groovy-safe-navigation-operator/src/Employee.javapublic class Employee {
String name;
String dept;
public Employee(String name, String dept) {
this.name = name;
this.dept = dept;
}
@Override
public String toString() {
return "Employee{" +
"name='" + name + '\'' +
", dept='" + dept + '\'' +
'}';
}
}
Without Safe Navigation operator
/src/WithoutSafeNavOp.groovyvoid displayEmployeeNameLength(Employee emp) {
printf "employee: %s, name: %s, name length: %s%n",
emp, emp.name, emp.name.length()
}
displayEmployeeNameLength(new Employee("Sara", "Admin"))
displayEmployeeNameLength(null);
displayEmployeeNameLength(new Employee(null, null))
Outputemployee: Employee{name='Sara', dept='Admin'}, name: Sara, name length: 4 Caught: java.lang.NullPointerException java.lang.NullPointerException at WithoutSafeNavOp.displayEmployeeNameLength(WithoutSafeNavOp.groovy:2) at WithoutSafeNavOp$displayEmployeeNameLength.callCurrent(Unknown Source) at WithoutSafeNavOp.run(WithoutSafeNavOp.groovy:7) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
With Safe Navigation operator
src/WithSafeNavOp.groovyvoid displayEmployeeNameLength(Employee emp) {
printf "employee: %s, name: %s, name length:: %s%n",
emp, emp?.name, emp?.name?.length()
}
displayEmployeeNameLength(new Employee("Sara", "Admin"))
displayEmployeeNameLength(null);
displayEmployeeNameLength(new Employee(null, null))
Outputemployee: Employee{name='Sara', dept='Admin'}, name: Sara, name length:: 4 employee: null, name: null, name length:: null employee: Employee{name='null', dept='null'}, name: null, name length:: null
Example ProjectDependencies and Technologies Used: |
|