groovy - @CompileStatic 给出 NullPointerException

标签 groovy

为什么只用@CompileStatic 注释会使下面的代码给出 NullPointerException?

class GroovyEach {
    static def main(args) {
        List items = null

        items.each {
            println 'hello'
        }

    }
}

下面的代码给出了异常(exception)。
import groovy.transform.CompileStatic

@CompileStatic
class GroovyEach {
    static def main(args) {
        List items = null

        items.each {
            println 'hello'
        }

    }
}

堆栈跟踪:
Exception in thread "main" java.lang.NullPointerException
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:1372)
    at trial.GroovyEach.main(GroovyEach.groovy:10)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

最佳答案

这是旧的 question 的倒数.静态编译时,items类型为 List , 未静态编译时,类型为 NullObject ,它以空安全的方式检索迭代器。这很容易证明。

这有效

class GroovyEach {
    static void main(String[] args) {
        List items = null
        (org.codehaus.groovy.runtime.NullObject) items
    }
}

这失败了 [Static type checking] - Inconvertible types: cannot cast java.util.List to org.codehaus.groovy.runtime.NullObject
@groovy.transform.CompileStatic
class GroovyEach {
    static void main(String[] args) {
        List items = null
        (org.codehaus.groovy.runtime.NullObject) items
    }
}

关于groovy - @CompileStatic 给出 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29285084/

相关文章:

java - Spring bean 配置使用来自另一个带有 grails DSL 的 bean 的静态方法

groovy - 在 Linux 上将 POI 添加到 groovy/java

java - 如何在Grails的脚手架 View 中显示ID列?

java - Groovy/Java 映射排序

java - Gradle 没有找到 tools.jar

grails - 如何从GSP文件中的g:uploadForm获得结果(成功/失败)?

jenkins - Groovy 脚本取消在 Email-Ext 插件中发送电子邮件

java - Elasticsearch Java/Groovy API : how can I send JSON requests

groovy - 如何为 Jenkins 管道中的失败阶段实现重试选项?

reflection - 打印出 Groovy 对象中的变量和值