What does the question mark mean in GSP/Grails?
Solution 1
It's the "Safe Navigation Operator", which is a Groovy feature that concisely avoids null pointer exceptions. See http://docs.groovy-lang.org/latest/html/documentation/index.html#_safe_navigation_operator
In this case, if phoneInstance
is null, then it doesn't try to get the name
property and cause a NPE - it just sets the value of the field tag to null.
Solution 2
The ?
operator allows null values in Groovy (and thusly, GSP). For example, normally in gsp,
<g:field name="amount" value="${priceDetails.amount}" />
If priceDetails
is null, this will throw a NullPointerException
.
If we use the ?
operator instead ...
<g:field name="amount" value="${priceDetails?.amount}" />
now the value of ${priceDetails?.amount}
is null, instead of throwing a null pointer exception.
Solution 3
This is very important feature in Groovy. If the object is null (ie, "phoneInstance" is null) then it's provide "null" value. This feature is called "Safe Navigation Operator". Simply when we use this feature , No need of checking the object("phoneInstance") is null or not.
Solution 4
the safe navigation operator (?.) returns null if the object on the left is null, otherwise it returns the value of the right member of that object. so phoneInstance?.name
is just shorthandn for phoneInstance == null ? null : phoneInstance.name
for example:
a = x?.y
is just shorthand for:
a = (x == null ? null : x.y)
which is shorthand for:
if(x == null){
a = null
} else {
a = x.y
}
Amir Raminfar
user = new User() user.name = "amir" user.nerdy = true user.live()
Updated on June 06, 2022Comments
-
Amir Raminfar almost 2 years
I saw this in my generated GSP pages. What does the ? mean?
<g:textField name="name" value="${phoneInstance?.name}" />
-
Amir Raminfar over 13 yearsThank you! I had been googling it for a while but didn't find an answer.
-
barrymac over 12 yearsFor extra coolness you can also add a sensible default with the Elvis operator eg:
${phoneInstance?.number?:'+44'}
Rock groovy with the king baby!