为什么Long.parseLong(String s)不会将尾随的“L”视为有效?

时间:2016-04-20 09:37:04

标签: java long-integer

Long myLong = Long.parseLong("1L") // Throws NumberFormatException

我最好的猜测是,这样的额外检查会导致开销只会在任何人用{L}字符跟parseLong调用{1}}的时间内发挥〜1%(或更少)。

但这种“遗漏”背后可能有不同的原因吗?

4 个答案:

答案 0 :(得分:4)

它在方法java.lang.Long.parseLong(String)中定义:

  

字符串中的字符必须都是十进制数字,除此之外   第一个字符可能是ASCII减号...

答案 1 :(得分:2)

尾随L(或l)仅与Java 编译器相关,以区分int文字与long文字。它不是长值的通用标记,因此接受(并忽略)它会更像是一种奇怪的副作用,更不用说错误来源了。

答案 2 :(得分:1)

考虑Long.parseLong("1L");的使用案例,您最终会以String的形式获得长期值l

现在,如何在现实应用程序中获得此值,考虑GUI或控制台应用程序,将数字String转换为实际类型将不具有后缀ld。从用户输入到数据库值后缀l不能接受数字输入。对于转换为实际String值的业务逻辑,您永远不会将1L值视为Long

令人惊讶的是,另一方面,Double myDouble = Double.parseDouble("1d");可以正常工作,因为sun.misc.FloatingDecimal设法使用后缀d进行解析,因为double值可能包含其他字符,例如{{1}其中或E为指数期限。

答案 3 :(得分:1)

L中的1L向Java编译器指示该值为long 文字。它只对Java源代码有意义,用于消除1int字面值)的消歧。

当您将Long.parseLong(String)与字符串"1L"一起使用时,这是一个运行时错误,因为L不是基数10中的有效数字。也不需要消除歧义,因为你已经明确声明你想要一个Long作为结果。

或者更正式地说,Long.parseLong(String)的文档指定了:

  

将字符串参数解析为带符号的十进制长度。中的人物   string必须都是十进制数字,但第一个字符可以   是一个ASCII减号'-'(\u002D')来表示负值   或ASCII加号'+'('\u002B')表示正值。   返回结果long值,就像参数和   基数10作为参数给出   parseLong(java.lang.String, int)方法。

     

请注意,字符L('\u004C')和l('\u006C')都不是   允许作为类型指示符出现在字符串的末尾,   正如Java编程语言源代码所允许的那样。

这最后一段明确说明不允许这样做。