【问题标题】:new BigDecimal("0") NumberFormatExceptionnew BigDecimal("0") NumberFormatException
【发布时间】:2014-11-05 23:38:34
【问题描述】:

我在使用 BigDecimal 时遇到了一个奇怪的问题。

我有一个解析方法如下:

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);

但我不明白这应该如何破坏我的 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();

提前感谢您的宝贵时间。

【问题讨论】:

  • 如果你手动输入new BigDecimal("0")会发生什么?
  • 确定0后面没有空格?

标签: java bigdecimal numberformatexception icedtea


【解决方案1】:

您无法记录字符串变量来验证其内容,因为许多不同的字符串在视觉上无法区分。

相反,将所有字符串视为二进制数据。制作一个十六进制转储并进行比较。

这是重现您的输出和问题的一种方法:

$ 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)
$

【讨论】:

  • 就是这样,字符串中有 4 个额外的字符,记录器无法打印。我刚刚将长度和字符串一起打印出来,上面写着 5(没有十六进制转换)。无论如何,我解决了添加一个正则表达式以解析字符串并获得十进制数的问题。看来我必须学习如何正确登录,这似乎是一项简单的任务,但我意识到这真的很重要! :) 非常感谢,好地方!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多