我的常规代码如下:
String start
String startParam
String end
String endParam
String rule
Period period
String exDates
PeriodList expected = new PeriodList(true)
// init variables...
VEvent event = new ContentBuilder().vevent {
dtstart(start, parameters: parameters() { value(startParam) })
dtend(end, parameters: parameters() { value(endParam) })
rrule(rule)
exdate(exDates)
}
一般情况下它可以正常工作,但是如果某些参数没有用非null
值定义,我会得到一个例外:
java.lang.RuntimeException: Failed to create component for 'exdate' reason: java.lang.reflect.InvocationTargetException
at groovy.util.FactoryBuilderSupport.createNode(FactoryBuilderSupport.java:719)
at groovy.util.FactoryBuilderSupport.dispatchNodeCall(FactoryBuilderSupport.java:855)
at groovy.util.FactoryBuilderSupport.doInvokeMethod(FactoryBuilderSupport.java:779)
at groovy.util.FactoryBuilderSupport.invokeMethod(FactoryBuilderSupport.java:499)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeOnDelegationObjects(ClosureMetaClass.java:423)
at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:346)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:909)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:66)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141)
at net.fortuna.ical4j.model.VEventRecurrenceParametrizedTest$_test_closure2.doCall(VEventRecurrenceTest.groovy:79)
是否可以保护属性调用(如果变量为null
则忽略一个)?我检查了文档,有null-safe-operator
。例如,我如何在这种情况下使用一个?
如果exdate(exDates)
exdate
为空,则不应调用{p> exDates
。
如果我尝试
exdate(this.?exDates)
它没有帮助,因为如果value为null,则null安全操作符不会保护方法调用,除此之外,此代码exdate(this.?exDates)
有编译错误。
答案 0 :(得分:2)
在拨打电话之前,请检查它是否为空或空:
VEvent event = new ContentBuilder().vevent {
dtstart(start, parameters: parameters() { value(startParam) })
dtend(end, parameters: parameters() { value(endParam) })
rrule(rule)
if (exDates) exdate(exDates)
}