2014-11-05 2 views
2

У меня возникла странная проблема с BigDecimal.новый 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); 

но я не вижу, как это должно быть b reake мой метод 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

+0

Уверены, что после '0' нет пробела? –

ответ

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, чтобы разобрать строку и получить десятичное число. Похоже, мне нужно научиться правильно записывать, это кажется легкой задачей, но я понимаю, что это действительно важно! :) Спасибо большое! –

 Смежные вопросы

  • Нет связанных вопросов^_^