Double.parseDouble和Integer.parseInt之间的行为差​​异

时间:2018-02-07 17:18:17

标签: java

似乎parseDouble可以接受带有尾随空格的字符串,但是parseInt和parseLong会抛出异常。

e.g。对于此测试用例

@Test
public void testNumberParsing() {
    try {
        Double.parseDouble("123.0 ");
        System.out.println("works");
    }catch (NumberFormatException e) {
        System.out.println("does not work");
    }
    try {
        Integer.parseInt("123 ");
        System.out.println("works");
    }catch (NumberFormatException e) {
        System.out.println("does not work");
    }
    try {
        Long.parseLong("123 ");
        System.out.println("works");
    }catch (NumberFormatException e) {
        System.out.println("does not work");
    }
}

结果

works
does not work
does not work

为什么行为不同?这是故意的吗?

3 个答案:

答案 0 :(得分:5)

实际记录了这种行为(虽然这是一个非常糟糕的设计......)!

Double.parseDouble

  

返回一个初始化为由指定String表示的值的新double,由double类的valueOf方法执行。

Double.valueOf

  

s中的前导和尾随空白字符将被忽略。删除空格,就像使用String.trim()方法一样;也就是说,删除了ASCII空格和控制字符。

Integer.parseInt

  

字符串中的字符必须全部为十进制数字,但第一个字符可能是ASCII减号' - ' (' \ u002D')表示负值或ASCII加号' +' (' \ u002B')表示正值。

答案 1 :(得分:1)

来自parseDouble

的源代码
  in = in.trim(); // don't fool around with white space.

然而,parseInt的情况不会发生这种情况。他们只是检查null并继续进行。

同意你的意见。作者也应该为Integer做同样的事情。

答案 2 :(得分:0)

我认为不是同一个作者,因此从Java API的角度看是不连贯的。 一个人认为你必须处理修剪自己,而另一个人认为这个方法可以为你做。 我不确定我更喜欢哪一个,有时更严格的代码(不那么宽松)会更好。