【问题标题】:Why does java accept Long format with underscore, but it doesn't parse it using String?为什么java接受带下划线的Long格式,但不使用String解析它?
【发布时间】:2017-12-06 23:45:05
【问题描述】:

我知道 long val = 1_000_000L; 这种格式在 java 中是有效的,但我发现不符合条件的是 Long#parseLong 方法的行为,如果它作为 String 传递,它不会解析这种格式,我尝试了下面的代码,我总是得到异常:

   String h = "1_000_000L";
    long val = 1_000_000L;
    System.out.printf("this a valid format : %d\n", val);
    try {
        Long m = Long.parseLong(h);
        System.out.println(m);
    } catch (NumberFormatException e) {
        System.out.printf("cannot parse this number : %s\n", h);
    }

注意。我正在构建类似于个人 java 编译器 的东西,我希望它能够在不摆脱下划线格式的情况下工作。

【问题讨论】:

  • 哈哈...我以前从未在 Java 程序中使用过下划线。另外,祝你的个人 Java 编译器好运(如果我问为什么?)。我做了一个个人Java方言(JavaX),但它转译成Java源代码,然后调用Eclipse编译器。
  • Long API 是很久以前决定的。您可能会通过更改其语义来破坏现有程序。
  • 我建议您在编译器工作的这一点上了解更多关于标记器的信息。
  • @StefanReich 假设这是一个学习问题
  • 检查 parseLong 的工作原理:pastebin.com/gd8hUA7e

标签: java parsing numberformatexception


【解决方案1】:

从来没有要求您可以在源代码中键入的数字文字与从 String 解析的数字的工作方式相同。

这里是Javadocs of Long.parseLong

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

因此,不仅不允许使用下划线,还不允许使用 L 后缀。它并不是要从源代码中解析格式的数字。

The underscores in numeric literals were introduced in Java 7,但只是为了提高源代码的可读性,而不是对字符串进行编程解析。

在 Java SE 7 及更高版本中,任意数量的下划线字符 (_) 可以出现在数字文字中数字之间的任何位置。例如,此功能使您可以分隔数字文字中的数字组,从而提高代码的可读性。

这些功能是完全独立的,并不意味着彼此一致。

您得到的NumberFormatException 是预期的,它工作正常。

【讨论】:

  • 是的,感谢您的启发,但我只是想知道为什么不知道它是根据 java 编译器的有效格式吗?
猜你喜欢
  • 2010-10-06
  • 2012-12-28
  • 2010-10-06
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 2021-11-26
相关资源
最近更新 更多