我想用Groovy構建一個微觀模擬模型,但是我遇到了一個問題,我追溯到了Groovy在Groovy Bean構造函數中處理空值的問題。Groovy Beans標準構造函數如何處理空值?
總之,constructor method that Groovy offers
new Person(nrLegs:calculationResult1, nrArms:calculationResult2)
拋出IllegalArgumentException
如果計算結果之一爲空,這是我怎麼想的失蹤調查數據將被最好的代表。
這對我來說似乎很奇怪:如果我定義了一個沒有值的變量double age;
,它顯然設置爲null。
double testDouble;
assert testDouble == null; // no Problem
如果我做的Groovy bean一樣,它具有0.0的值,例如:
class Person {
double age;
int nrLegs, nrArms;
}
然後
Person testPerson = new Person(nrArms:calculationResult1)
assert testPerson.age == null; // Assertion failed. testPerson.age == 0.0
此外,我不能設置屬性使用爲null Groovy語法:
Person testPerson = new Person(nrArms:calculationResult1)
testPerson.age = null; // IllegalArgumentException
這似乎與上述完全相同的問題。
爲什麼Groovy會禁止我分配空值?
感謝您的幫助!
編輯:供參考,這裏是the entire Person class和StackTrace。
將變量的類型從「int」更改爲「Integer」真的解決了這個問題,謝謝!但是,這提出了問題**爲什麼**?首先,[Groovy沒有原始數據類型](http://www.vogella.de/articles/Groovy/article.html#datatypes)。其次,作爲我提供的第一個示例,Groovy中的「原始」數據類型(如'double')_can_可以設置爲null。這是一個錯誤? – mzuba
當然,Groovy沒有原始類型 - 但不是你的Person類Java嗎?(如果沒有看到文件後綴,我就說不出來了 - 是不是'.java'? - 它看起來像Java)。 Groovy必須通過自動「拆箱」(在對象和原始類型之間轉換)與編譯的java類互操作。這是拆箱造成你原來的IllegalArgumentException。 您可以通過確保您的Person類編譯爲groovy而不是java來避免所有這些。 – winstaan74
文件擴展名是'.groovy',而不是'.java'。我不確定它是否被編譯爲Groovy,但我想它是,因爲否則方法'新人(age:xyz,nrCond:xyz)'不起作用,會嗎? – mzuba