我正在尝试使用Groovy构建一个微模拟模型,但是我遇到了一个问题,我追溯到Groovy在Groovy Bean构造函数中处理null值。
简而言之,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
此外,我无法使用Groovy语法将属性设置为null:
Person testPerson = new Person(nrArms:calculationResult1)
testPerson.age = null; // IllegalArgumentException
这似乎与上述问题完全相同。
为什么Groovy会禁止我分配空值?
感谢您的帮助!
修改:供参考,此处为the entire Person class和StackTrace。
答案 0 :(得分:5)
问题在于您尝试将null
分配给int
类型的bean属性。
int
是一种原始类型。它不是一个对象,因此不可为空:它必须有一个值。这些规则与Java相同 - 原始类型为int
,float
,boolean
,double
,char
....在对象创建时,基本属性初始化为0,0.0,false等
如果需要表示“无数据”,那么最好编辑类定义,以便bean属性使用相应的对象包装类型 - 在本例中为Integer
- 然后可以将其设置为{ {1}}。
如果您无法编辑课程,那么常见的解决方法是使用某种标记值 - 例如null
,或-1
,或某些人。但是操纵Person类的逻辑需要理解标记值的重要性