
- Groovy Tutorial
- Groovy - Home
- Groovy - Overview
- Groovy - Environment
- Groovy - Basic Syntax
- Groovy - Data Types
- Groovy - Variables
- Groovy - Optionals
- Groovy - Numbers
- Groovy - Strings
- Groovy - Ranges
- Groovy - Lists
- Groovy - Maps
- Groovy - Dates & Times
Groovy Operators
- Groovy - Operators
- Groovy - Arithmetic Operators
- Groovy - Assignment Operators
- Groovy - Relational Operators
- Groovy - Logical Operators
- Groovy - Bitwise Operators
- Groovy - Spaceship Operator
- Groovy - in Operator
- Groovy - Elvis Operator
- Groovy - Safe Navigation Operator
- Groovy Operator Precedence & Associativity
Control Statements
- Groovy - Decision Making
- Groovy - If Else Statement
- Groovy - Switch Statement
- Groovy - Loops
- Groovy - For Loop
- Groovy - For-in Loop
- Groovy - While Loop
- Groovy - Do While Loop
- Groovy - Break Statement
- Groovy - Continue Statement
Groovy File Handling
- Groovy - File I/O
- Java - Create a File
- Java - Write to File
- Java - Append to File
- Java - Read Files
- Java - Delete Files
- Java - File Properties
- Java - File Existence and Type
- Java - File Size
- Java - File Permissions
- Java - Directories
- Java - Listing Directories
- Java - Filtering Files/Directories
- Java - Deleting Directories
- Java - Renaming Files/Directories
Groovy Error & Exceptions
- Groovy - Exception Handling
- Groovy - try-catch Block
- Groovy - try-with-resources
- Groovy - Multi-catch Block
- Groovy - Nested try Block
- Groovy - Finally Block
- Groovy - throw Exception
- Groovy - Exception Propagation
- Groovy - Built-in Exceptions
- Groovy - Custom Exception
Groovy Multithreading
- groovy - Multithreading
- groovy - Thread Life Cycle
- groovy - Creating a Thread
- groovy - Starting a Thread
- groovy - Joining Threads
- groovy - Naming Thread
- groovy - Thread Scheduler
- groovy - Thread Pools
- groovy - Main Thread
- groovy - Thread Priority
- groovy - Daemon Threads
- groovy - Shutdown Hook
Groovy Synchronization
- groovy - Synchronization
- groovy - Block Synchronization
- groovy - Static Synchronization
- groovy - Inter-thread Communication
- groovy - Thread Deadlock
- groovy - Interrupting a Thread
- groovy - Thread Control
- groovy - Reentrant Monitor
- Groovy - Methods
- Groovy - Methods
- Groovy - Optional parenthesis
- Groovy - Named Arguments
- Groovy - Closures as Arguments
- Groovy - Method Overloading
- Groovy - Method Scope and Visibility
- Groovy - isCase Method
- Groovy - Implicit Return
- Groovy - Variable Arguments
- Groovy - Regular Expressions
- Groovy - Regular Expressions
- Groovy - Defining Regular Expressions
- Groovy - Matcher Object
- Groovy - Regex Tasks
- Groovy - XML
- Groovy - XML
- Groovy - Parsing XML
- Groovy - Creating XML
- Groovy - Modifying XML
- Groovy - Querying XML
- Groovy - Simplified Notation
- Groovy - Closure based Querying
- Groovy - Closure based Creation
- Groovy - JSON
- Groovy - JSON
- Groovy - Parsing JSON
- Groovy - Creating JSON using JsonOutput
- Groovy - Creating JSON using JsonBuilder
- Groovy - Modifying JSON
- Groovy - Error Handling
- Groovy - Handling JSON Arrays
- Groovy - JSON Array Operations
- Groovy - JSON Objects
- Groovy - JSON Object Operations
- Groovy - Generics
- Groovy - Generics
- Groovy - Declaring Generic Types
- Groovy - Bound Type Parameters
- Groovy - Wild Cards
- Groovy - Miscellaneous
- Groovy - Object Oriented
- Groovy - Closures
- Groovy - Annotations
- Groovy - JMX
- Groovy - DSLS
- Groovy - Database
- Groovy - Builders
- Groovy - Command Line
- Groovy - Unit Testing
- Groovy - Template Engines
- Groovy - Meta Object Programming
- Groovy Useful Resources
- Groovy - Quick Guide
- Groovy - Useful Resources
- Groovy - Discussion
Groovy - Safe Navigation Operator
safe navigation operator ?. is a powerful tool in Groovy to avoid null pointer exceptions while accessing properties or methods of potential null object. It provides an elegant and concise way to navigate through object's nested properties or methods.
Syntax - Safe Navigation Operator
Object?.property Object?.method() Object?.nested-property?.another-nested-property
Working of Safe Navigation Operator
When a safe navigation(?.) operator is used instead of normal dot(.) operator, Groovy checks if object on the left side is null.
In case object is not null then safe navigation(?.) operator works same as normal dot(.) operator.
If object is null then safe navigation(?.) operator instead of throwing a null pointer exception returns null gracefully and skip rest of the nested chain.
Example - Accessing a potential null property
Example.groovy
class Address { String city } class User { Address address String name } def user = new User(name: "Julie") def address = user.address def city = user?.address?.city println "Address: ${address}" // prints null instead of null pointer as address is null println "City: ${city}"
Output
When we run the above program, we will get the following result.
Address: null City: null
Example - Accessing a potential null method
Example.groovy
class Address { String city } class User { Address address String name } def user = null def name = user?.getName() println "Name: ${name}"
Output
When we run the above program, we will get the following result.
Name: null
Example - Chaining safe navigation Operators
Example.groovy
class Address { String city String street } class User { Address address String name } def street = user?.address?.street?.toUpperCase() // street is null if any of user, address or street is null println "Street: ${street}"
Output
When we run the above program, we will get the following result.
Street: null
Example - Chaining safe navigation Operators
Example.groovy
class Address { String city String street } class User { Address address String name } def user = null def street = user?.address?.street?.toUpperCase() // street is null if any of user, address or street is null println "Street: ${street}"
Output
When we run the above program, we will get the following result.
Street: null
Example - Integration with Elvis Operator
Example.groovy
class Address { String city String street } class User { Address address String name } def user = null def city = user?.address?.city ?: "Unknown City" println "City: ${city}" def nameLength = user?.name?.length() ?: 0 println "Length of Name: ${nameLength}"
Output
When we run the above program, we will get the following result.
City: Unknown City Length of Name: 0