Groovy的。如果参数为null,如何忽略方法调用?在我的情况下,是否可以使用null安全运算符?

时间:2017-08-16 09:02:01

标签: groovy junit parameters parameter-passing

我的常规代码如下:

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)有编译错误。

1 个答案:

答案 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)
}