这对我来说似乎很奇怪,完全让我站在愿意使用普通java的人的一边。在编写基于groovy的应用程序时,我遇到了这样的事情:
int filesDaily1 = (item.filesDaily ==~ /^[0-9]+$/) ?
Integer.parseInt(item.filesDaily) : item.filesDaily.substring(0, item.filesDaily.indexOf('.'))
def filesDaily = (item.filesDaily ==~ /^[0-9]+$/) ?
Integer.parseInt(item.filesDaily) : item.filesDaily.substring(0, item.filesDaily.indexOf('.'))
因此,知道item.filesDaily是一个值为'1 .. *'的String,怎么可能,filesDaily1等于49而filesDaily等于1?
当尝试做类似
的事情时,更重要的是int numOfExpectedEntries = filesDaily * item.daysToCheck
抛出异常说
Cannot cast object '111' with class 'java.lang.String' to class 'int'
指向带有乘法的精确代码行。怎么会发生这种情况?
答案 0 :(得分:5)
您将此值分配给int:
item.filesDaily.substring(0, item.filesDaily.indexOf('.'))
我猜测 Groovy正在将单字符串“1”转换为char'1',然后在正常的char-to-int转换中获取Unicode值...所以你最终得到了49。
如果要将字符串解析为十进制数,请使用Integer.parseInt
而不是内置转换。
filesDaily1
和filesDaily
之间的区别在于你告诉Groovy filesDaily1
是一个int,所以它正在应用转换为int。我怀疑filesDaily
实际上是测试用例中的字符串“1”。
我怀疑您真的只想将代码更改为:
String text = (item.filesDaily ==~ /^[0-9]+$/) ? items.filesDaily :
item.filesDaily.substring(0, item.filesDaily.indexOf('.'))
Integer filesDaily = text.toInteger()
答案 1 :(得分:4)
这是groovy类型转换代码中的一个错误。
int a = '1'
int b = '11'
返回不同的结果,因为使用了不同的转换器。在示例中,a
将为49,而b
将为11.为什么?
单字符到int转换(使用String.charAt(0)
)的优先级高于整数解析器。
坏消息是所有单个字符串都会发生这种情况。你甚至可以int a = 'A'
给你65。
只要您无法知道字符串的长度,就必须使用Integer.parseInt()
而不是依赖于自动类型转换。