【问题标题】:Why don't I get a NullPointerException in Groovy in this case?在这种情况下,为什么我在 Groovy 中没有得到 NullPointerException?
【发布时间】:2011-03-29 12:52:05
【问题描述】:

我有这个测试代码:

def test = null

test.each {  } 

为什么我没有得到任何异常?

【问题讨论】:

标签: groovy null


【解决方案1】:

each 的实现尝试以空安全方式调用其目标的iterator 方法。如果在空对象或没有iterator 方法的对象上调用each,则不会发生任何事情。

我还没有看到源代码,但它可能看起来像这样§

Object each(Closure closure) {

  if (this?.respondsTo("iterator")) {

    def iterator = this.iterator()

    while (iterator.hasNext() {
      def item = iterator.next()
      closure(item)
    }
  }
  return this
}

§ 实际上,这个方法可能是用 Java 而不是 Groovy 编写的

【讨论】:

  • 其实是在org.codehaus.groovy.runtime.NullObject.java,其中有一个方法定义为public Iterator iterator() { return Collections.EMPTY_LIST.iterator(); } 所以NullObject (null) 在被查询时返回一个Iterator 到一个空的List each
  • 呵呵,你的奇幻世界太享受了吧? ;-)
【解决方案2】:

使用 each 闭包时的 null 值与具有 0 个元素的集合相同。如果你有代码

def test=null
test.each {println "In closure with value "+it}

打印语句不会执行。如果您将测试更改为

def test=[1,2,3]

你会得到输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多