2011-08-11 61 views
1

我想用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 classStackTrace

回答

5

問題是,您正嘗試將null分配給int類型的bean屬性。

int是一種原始類型。它不是一個對象,所以不能爲空:它必須有一個值。這些規則與Java相同 - 原始類型爲int,float,boolean,double,char ...。在創建對象時,原始屬性被初始化爲0,0.0,假等。

如果您需要表示'無數據',那麼最好編輯類定義,以便bean屬性使用相應的對象包裝類型 - 在這種情況下,Integer - 然後可以設置爲null

如果您無法編輯該類,那麼常見的解決方法是使用某種標記值 - 例如, -1Integer.MIN_VALUE,或其他。但後來操縱Person類的邏輯需要了解標記值的意義

+0

將變量的類型從「int」更改爲「Integer」真的解決了這個問題,謝謝!但是,這提出了問題**爲什麼**?首先,[Groovy沒有原始數據類型](http://www.vogella.de/articles/Groovy/article.html#datatypes)。其次,作爲我提供的第一個示例,Groovy中的「原始」數據類型(如'double')_can_可以設置爲null。這是一個錯誤? – mzuba

+0

當然,Groovy沒有原始類型 - 但不是你的Person類Java嗎?(如果沒有看到文件後綴,我就說不出來了 - 是不是'.java'? - 它看起來像Java)。 Groovy必須通過自動「拆箱」(在對象和原始類型之間轉換)與編譯的java類互操作。這是拆箱造成你原來的IllegalArgumentException。 您可以通過確保您的Person類編譯爲groovy而不是java來避免所有這些。 – winstaan74

+0

文件擴展名是'.groovy',而不是'.java'。我不確定它是否被編譯爲Groovy,但我想它是,因爲否則方法'新人(age:xyz,nrCond:xyz)'不起作用,會嗎? – mzuba

相關問題