2014-11-05 190 views
2

我有一個BigDecimal奇怪的問題。new BigDecimal(「0」)NumberFormatException

我有一個分析方法如下:

protected BigDecimal parseBigDecimalFromText(String text) { 
    Logger.info("parseBigDecimalFromText("+text+")"); 
    return new BigDecimal(text); 
} 

現在,當我跑我的測試代碼正常工作。

@Test 
public void parseBigDecimalFromZero() { 
    Logger.createLogger(); 

    // given 
    String text = "0"; 

    // when 
    BigDecimal bigDecimal = basicPage.parseBigDecimalFromText(text); 

    // then 
    Assert.assertEquals(new BigDecimal("0"), bigDecimal); 
} 

但是,當我執行我的應用程序正是通過相同的字符串「0」,我得到了一個「java.lang.NumberFormatException」

以下是日誌:

2014-11-05 23:21:33.142: INFO - parseBigDecimalFromText(0) 
2014-11-05 23:21:33.142: SEVERE - null 
java.lang.NumberFormatException 
    at java.math.BigDecimal.<init>(BigDecimal.java:470) 
    at java.math.BigDecimal.<init>(BigDecimal.java:739) 
    at com.aa.travian.pages.BasicPage.parseBigDecimalFromText(BasicPage.java:121) 

我知道,當我的應用程序啓動我設置特定區域設置:

Locale locale = getConfig().getLocale(); 
ResourceBundle = ResourceBundle.getBundle("translations", locale); 

但我不明白這應該如何reak我的parseBigDecimalFromText方法。

以下是我的Java版本:

java -versionjava version "1.7.0_65" 
OpenJDK Runtime Environment (IcedTea 2.5.2) (7u65-2.5.2-3~14.04) 
OpenJDK 64-Bit Server VM (build 24.65-b04, mixed mode) 

任何想法,這裏發生了什麼? 望着BigDecimal的源代碼,它看起來像它屬於在解析指數:

// exponent expected 
if ((c != 'e') && (c != 'E')) 
    throw new NumberFormatException(); 

預先感謝您的時間。

+0

如果手動'新的BigDecimal( 「0」)'型,會發生什麼? – Dici 2014-11-05 23:47:16

+0

確定'0'後面沒有空格嗎? – 2014-11-06 00:07:03

回答

2

您無法記錄字符串變量來驗證其內容,因爲許多不同的字符串在視覺上不可區分。

相反,將所有字符串視爲二進制數據。做一個十六進制轉儲並比較它。

這裏是重現你的輸出和解決問題的一個辦法:

$ cat Test.java 
import java.util.regex.*; 
import java.util.logging.*; 
import java.math.*; 

class Test { 
    public static void main(String[] args) { 
     Logger logger = Logger.getLogger("test"); 
     String text = "0\0"; 
     logger.info("parseBigDecimalFromText("+text+")"); 
     new BigDecimal(text); 
    } 
} 

$ javac Test.java 
$ java Test 
Nov 06, 2014 12:55:40 AM Test main 
INFO: parseBigDecimalFromText(0) 
Exception in thread "main" java.lang.NumberFormatException 
     at java.math.BigDecimal.<init>(BigDecimal.java:470) 
     at java.math.BigDecimal.<init>(BigDecimal.java:739) 
     at Test.main(Test.java:10) 
$ 
+0

就是這樣,記錄器無法打印的字符串中有4個額外的字符。我只是打印出長度和字符串一樣,它說5(沒有十六進制轉換)。 無論如何,我解決了添加一個REGEX爲了解析字符串並得到一個十進制數字。 它看起來像我必須學會如何正確登錄,這似乎是一個容易的任務,但我意識到它非常重要! :) 非常感謝和好地方! – 2014-11-07 09:02:27

相關問題