如何在Java中避免NumberFormatException?

时间:2010-11-18 10:06:15

标签: java exception casting

我找到了,但是一切都行不通。我的问题是,当我想从NumberFormatException投射到String时,会抛出double

字符串数组atomized包含许多字符串,我尝试先输出,使它们可见,所以我可以肯定有数据。唯一的问题是双重值。它类似于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 个答案:

答案 0 :(得分:11)

这里工作正常。因此,对于小数分隔符,我假设您的系统区域设置为,而不是.。要避免这些事情,您可以使用DecimalFormat

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

根据您的变量的名称判断 - 帐户 - 我假设您正在处理金钱。您绝不能使用浮点类型来代表金钱。使用BigDecimal,或可能使用int

答案 1 :(得分:3)

This是使用DecimalFormat将字符串转换为数字的起点。此外,如果您正在处理货币和货币,则应考虑使用BigDecimal而不是双倍。

答案 2 :(得分:2)

您在带有小数点的数字上使用Integer.parseInt - 这不是有效整数 - 在堆栈跟踪中可见