【问题标题】:Difference in behaviour between Double.parseDouble and Integer.parseInt [duplicate]Double.parseDouble 和 Integer.parseInt 之间的行为差​​异 [重复]
【发布时间】:2018-07-18 02:11:08
【问题描述】:

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

例如对于这个测试用例

@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

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

【问题讨论】:

  • 链接副本中的唯一答案只讨论了这些方法的实现,甚至没有提到这种行为也记录在the JavaDocs
  • 简而言之,它的历史——Integer.parseInt 从一开始就存在,Double.parseDouble 根据 JavaDocs 是在 1.2 中添加的。我想,要找出这些决定背后的原因需要一些邮件列表考古学。出于向后兼容性的考虑,它们从未更改过。

标签: java


【解决方案1】:

来自parseDouble的源码

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

但是在parseInt 的情况下不会发生这种情况。他们只是检查null 并继续进行。

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

【讨论】:

  • 或者相反:)
  • @ChristopheRoussy 希望在下一个版本中;)
  • @ꜱᴜʀᴇꜱʜᴀᴛᴛᴀ 这两种方法中的任何一种的行为都极不可能被改变——它们已经存在了很长时间,并且行为被记录在案,因此是方法合同和可以信赖。
  • @Hulk 没错。我们别无选择,只能跟他们走。
【解决方案2】:

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

Double.parseDouble:

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

Double.valueOf:

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

Integer.parseInt:

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

【讨论】:

  • 记录在案但不连贯。
  • @ChristopheRoussy 是的,我想这是真的。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2012-03-20
    • 2013-04-25
    • 2012-11-21
    • 2012-12-16
    • 2018-07-24
    • 2016-08-26
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多