Details
-
Type:
Bug
-
Status:
Closed
-
Priority:
Critical
-
Resolution: Fixed
-
Affects Version/s: 1.6-beta-2, 1.6-rc-1, 1.6-rc-2
-
Fix Version/s: 1.6-rc-3, 1.6.1, 1.7-beta-1
-
Component/s: None
-
Labels:None
-
Testcase included:yes
-
Number of attachments :
Description
The following code breaks Groovy 1.6 with NPE, while passes fine on Groovy 1.5.7:
[code]
--------- test.gr --------------
public class Day extends Date {
static sdf = new java.text.SimpleDateFormat("dd.MM.yyyy")
public static Day get(_date)
{ return new Day(sdf.parse(_date)) }def hours = []
public Day(Date _date) {
super(_date.time)
def time = getTime()
24.times
}
public String toString()
{ sdf.format(this) }static def period = (1..3).toList().collect { get "1$
{it}.11.2007" }
}
println new Day(new Date())
--------------------------------
[/code]
>> groovy-1.6-RC2/bin/groovy test.gr
[code]
Caught: java.lang.ExceptionInInitializerError
java.lang.ExceptionInInitializerError
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
. . .
Caused by: java.lang.NullPointerException: Cannot invoke method times() on null object
at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:77)
at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:743)
at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:720)
at org.codehaus.groovy.runtime.callsite.NullCallSite.call(NullCallSite.java:17)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:43)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)
at Day.<init>(test.gr:14)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
. . .
[/code]
the code can be reduced to
If you execute the above, then you will get the output that 24 is first null and then the normal 24. I assume that since we use predefined constants in static fields, that the constant is not initialized when period gets its value. But something prevents period2 from getting null too. Either that number is not cached in a field or some special ordering happens.