2011-06-20 16 views
1

這對我來說似乎相當古怪,完全讓我置身於願意使用普通java的人身邊。在寫一個Groovy基於應用程序我遇到這樣的事情: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是值的String「1 .. *」怎麼都不可能,那filesDaily1等於49 filesDaily等於1?

更重要的是,試圖做類似

int numOfExpectedEntries = filesDaily * item.daysToCheck 

時拋出一個異常說

Cannot cast object '111' with class 'java.lang.String' to class 'int' 

指向的代碼與乘法,準確的線。這怎麼可能發生?

回答

5

你這個值賦給一個int:

item.filesDaily.substring(0, item.filesDaily.indexOf('.')) 

猜測 Groovy就是單字符串轉換爲「1」進入字符「1」,然後採取統一值在正常的char-to-int轉換中...所以最終的值爲49.

如果要將字符串解析爲十進制數,請使用Integer.parseInt而不是內置轉換。

filesDaily1filesDaily這裏的區別是,你告訴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

+1這顯然是Groovy 2.0中被刪除的東西之一,因爲它很混亂......單個char字符串通過'char'轉換爲'int' ...多字符字符串拋出異常 –

+0

是的。 ..在發佈後幾秒鐘就注意到了它。雖然異常消息仍然模糊。 –

+1

@den,認爲你可以改變三元表達式爲'int filesDaily1 = Integer.parseInt((item.filesDaily =〜/^([0-9]+).*$/)[0] [1])'which *可能會更簡單...否則;-) –

4

這是在常規類型的轉換代碼中的bug。

int a = '1' 
int b = '11' 

返回不同的結果,因爲使用了不同的轉換器。在這個例子中,a將是49,而b將是11.爲什麼?

單字符到整數轉換(使用String.charAt(0))的優先級高於整數解析器。

壞消息是,這發生在所有單個字符串。你甚至可以做int a = 'A'它給你65.

只要你無法知道字符串是多久,你必須使用Integer.parseInt(),而不是依靠自動類型轉換。

+1

我不認爲這是一個錯誤,這是一個令人驚訝的功能;-) –