Long myLong = Long.parseLong("1L") // Throws NumberFormatException
我最好的猜测是,这样的额外检查会导致开销只会在任何人用{L}字符跟parseLong
调用{1}}的时间内发挥〜1%(或更少)。
但这种“遗漏”背后可能有不同的原因吗?
答案 0 :(得分:4)
它在方法java.lang.Long.parseLong(String)中定义:
字符串中的字符必须都是十进制数字,除此之外 第一个字符可能是ASCII减号...
答案 1 :(得分:2)
尾随L
(或l
)仅与Java 编译器相关,以区分int
文字与long
文字。它不是长值的通用标记,因此接受(并忽略)它会更像是一种奇怪的副作用,更不用说错误来源了。
答案 2 :(得分:1)
考虑Long.parseLong("1L");
的使用案例,您最终会以String
的形式获得长期值l
。
现在,如何在现实应用程序中获得此值,考虑GUI或控制台应用程序,将数字String
转换为实际类型将不具有后缀l
或d
。从用户输入到数据库值后缀l
不能接受数字输入。对于转换为实际String
值的业务逻辑,您永远不会将1L
值视为Long
。
令人惊讶的是,另一方面,Double myDouble = Double.parseDouble("1d");
可以正常工作,因为sun.misc.FloatingDecimal
设法使用后缀d
进行解析,因为double
值可能包含其他字符,例如{{1}其中或E
为指数期限。
答案 3 :(得分:1)
L
中的1L
向Java编译器指示该值为long
文字。它只对Java源代码有意义,用于消除1
(int
字面值)的消歧。
当您将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编程语言源代码所允许的那样。
这最后一段明确说明不允许这样做。