Как я могу избежать исключения NumberFormatException в Java? - PullRequest
4 голосов
/ 18 ноября 2010

Я искал, я нашел, но все это не сработало.моя проблема в том, что NumberFormatException выбрасывается, когда я хочу привести от String к double.

Строковый массив атомизирован содержит много строк, и я попытался сделать вывод, прежде чем сделать их видимымиЯ мог быть уверен, что есть данные.Единственная проблема - двойное значение.это что-то вроде 5837848.3748980, но метод valueOf всегда выдает здесь исключение.Я понятия не имею, почему.

try
{
 int key = Integer.valueOf(atomized[0]);

 double value = Double.valueOf(atomized[1].trim());

 int role = Integer.valueOf(atomized[2]);

 Double newAccountState = this.bankKonto.charge(key, value, role);
 System.out.println("NEW Account State "+newAccountState);
 this.answerClient(newAccountState.toString());
}
catch (NumberFormatException e)
{
 System.out.println(e.getClass().toString()+" "+e.getMessage());
} 

Выход исключения:

java.lang.NumberFormatException: For input string: "109037.0"
        at java.lang.NumberFormatException.forInputString(Unknown Source)
        at java.lang.Integer.parseInt(Unknown Source)
        at java.lang.Integer.valueOf(Unknown Source)
        at vsys.ue02.server.Bank.computeData(Bank.java:122)
        at vsys.ue02.server.Bank.run(Bank.java:160)

Ответы [ 3 ]

11 голосов
/ 18 ноября 2010

Здесь отлично работает. Так что я бы предположил, что в вашей системной локали вместо . используется десятичный разделитель. Чтобы избежать этих вещей, вы можете использовать DecimalFormat:

new DecimalFormat().parse("5837848.3748980");

Судя по названию вашей переменной - учетной записи - я предполагаю, что вы имеете дело с деньгами. Вы никогда не должны использовать типы с плавающей запятой для представления денег. Используйте BigDecimal или, возможно, int

3 голосов
/ 18 ноября 2010

Это является отправной точкой для использования DecimalFormat для преобразования строк в числа. Кроме того, если вы имеете дело с деньгами и валютой, вам следует рассмотреть возможность использования BigDecimal вместо double.

2 голосов
/ 18 ноября 2010

Вы используете Integer.parseInt для числа с десятичной точкой - это недопустимое целое число - видимое в трассировке стека

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...