在这种情况下,为什么我在 Groovy 中没有得到 NullPointerException?

发布于 2024-10-28 08:50:57 字数 97 浏览 1 评论 0原文

我有这个测试代码:

def test = null

test.each {  } 

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

I have this test code:

def test = null

test.each {  } 

Why don't I get any exception?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦幻的味道 2024-11-04 08:50:57

each 的实现尝试以空安全方式调用其目标的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 编写的

The implementation of each tries to call the iterator method of it's target in a null-safe fashion. If each is called on a null object, or an object without an iterator method, nothing happens.

I haven't seen the source code, but it could look something like this§

Object each(Closure closure) {

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

    def iterator = this.iterator()

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

§ In reality, this method is probably written in Java rather than Groovy

潜移默化 2024-11-04 08:50:57

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

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

print 语句将不会执行。如果将测试更改为,

def test=[1,2,3]

您将得到输出。

A null value when using the each closure is the same as a collection with 0 elements. If you have the code

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

The print statement won't execute. If you change test to

def test=[1,2,3]

you will get output.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文