2015-03-26 3 views
4

Почему просто комментирование с помощью @CompileStatic делает код ниже, чтобы дать исключение NullPointerException?@CompileStatic дает NullPointerException

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

     items.each { 
      println 'hello' 
     } 

    } 
} 

Ниже приведено исключение.

import groovy.transform.CompileStatic 

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

     items.each { 
      println 'hello' 
     } 

    } 
} 

StackTrace:

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) 
+0

могли бы вы предоставить StackTrace также? –

+0

@IgorArtamonov, вы легко воспроизводите stacktrace самостоятельно. – Opal

+0

@ Opal Я так считаю. Но для установки нового проекта требуется 20 минут, настроить среду, скопировать код и попробовать, верно? не проще ли просто скопировать существующую stracktrace на вопрос? –

ответ

3

Это обратная старше 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 
    } 
} 
Смежные вопросы