Col*_*ert 59
你不具备使用"_",你可以.提案中给出的示例包括信用卡号,电话号码或简单的数字,在代码中有一个分隔符是有意义的.
对于"在预期有一串数字的位置",它只是在它应该以数字开始(或结束)的位置.这里有些例子.
请注意,根据此提议,下划线只能放在数字之间.它们不能单独放置在通常需要一串数字的位置:
int x1 = _52; //这是一个标识符,而不是数字文字.
int x2 = 5_2; // 好.(十进制文字)
int x2 = 52_; //非法.(下划线必须始终在数字之间)
int x3 = 5_______2; // 好.(十进制文字.)
int x4 = 0_x52; //非法.不能将下划线放在"0x"基数前缀中.
int x5 = 0x_52; //非法.(下划线必须始终在数字之间)
int x6 = 0x5_2; // 好.(十六进制文字)
int x6 = 0x52_; //非法.(下划线必须始终在数字之间)
int x6 = 0x_; //非法.(删除下划线无效)
int x7 = 0_52; // 好.(八进制文字)
int x7 = 05_2; // 好.(八进制文字)
int x8 = 052_; //非法.(下划线必须始终在数字之间)
资源:
小智 27
正如Javadoc所写:
在Java SE 7及更高版本中,任何数量的下划线字符(_)都可以出现在数字文字中的数字之间的任何位置.例如,此功能使您可以分隔数字文字中的数字组,这可以提高代码的可读性.
例如,如果您的代码包含具有多个数字的数字,则可以使用下划线字符来分隔三个组中的数字,类似于使用逗号或空格等标点符号作为分隔符的方式.
long creditCardNumber = 1234_5678_9012_3456L;
long socialSecurityNumber = 999_99_9999L;
float pi = 3.14_15F;
long hexBytes = 0xFF_EC_DE_5E;
long hexWords = 0xCAFE_BABE;
long maxLong = 0x7fff_ffff_ffff_ffffL;
byte nybbles = 0b0010_0101;
long bytes = 0b11010010_01101001_10010100_10010010;
Run Code Online (Sandbox Code Playgroud)
sim*_*eco 11
您不必在任何地方使用它,但如果您愿意,您可以在数字文字中的每个数字之间的任何位置使用它。
这对于提高可读性特别有用:
10_000_000_000 // Is equal to 10000000000
7_687_316_418_138_483.345_938 // Is equal to 7687316418138483.345938
Run Code Online (Sandbox Code Playgroud)
看起来有人杀死了原始帖子(OP)中的URL.这是一个讨厌的URL,以防一些格式化功能再次杀死它:
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
您所说的页面的具体报价如下:
您只能在数字之间放置下划线; 你不能在下列地方放置下划线:
在数字的开头或结尾
与浮点文字中的小数点相邻
在F或L后缀之前
在预期有一串数字的位置
顺便说一句,为了尽可能地保持安全,应该提到的是,对于第三点,你不能在D后缀之前使用下划线,如下例所示:
double trouble = 123.456_D; //fail
float myBoat = 321.123_F; //fail
long winded = 90210_L; //fail
Run Code Online (Sandbox Code Playgroud)
我也发现第三点很奇怪.我的意思是,在大多数情况下,所有场景都包含在前三个点中,那么这个神秘的"数字串"是什么呢?前三个点迫使他们添加这个神秘的第四个,实际上没有解决哪个场景?
最初我以为他们是在谈论十六进制表示法或二进制表示法,其中在b或x之后需要一个数字,如下面的例子不起作用:
byte size = 0_b111101; //fail
byte me = 0b_111101; //fail
int hexed = 0_x_BABE; //fail
Run Code Online (Sandbox Code Playgroud)
尽管如此,我认为技术上可能与第一点相同,后者表示下划线不能在数字的开头; 但当然,在使用二进制或十六进制时,'b'或'x'之后会出现'数字串',对吧?所以,如果我是一个博彩人,我可能会在二进制/十六进制场景背后投入一些资金.但我有另一个可能的情况,我可以对冲我的赌注.在这里.
就个人而言,我希望Java中有一条规则说你在谈论java.lang.String时只能使用'string'这个词.允许术语"字符串"保留其行人意义会导致混淆,这是一个完美的例子.
现在,如果第四点说"在数字的java.lang.String的位置",我可能会得出结论,他们正在谈论实际的java.lang.String对象,它们代表需要解析的数字.所以,拿这段代码:
int i = Integer.parseInt("123_456");
Run Code Online (Sandbox Code Playgroud)
那会编译吗?那会跑吗?它编译正常,但是当然,parseInt方法需要一个java.lang.String数字,并且验证或解析该数字java.lang.String将在运行时触发以下错误:
线程"main"中的异常java.lang.NumberFormatException:对于java.lang.Integer.parseInt(Integer.java:492)中java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)的输入字符串:"123_456" Tester.main上的java.lang.Integer.parseInt(Integer.java:527)(Tester.java:7)
当然,这是一个运行时错误,看起来Oracle文档实际上是在讨论将在编译时标记的错误.但这肯定是一个预计会出现"数字串"的情景.
现在,如果只有Oracle文档是Wiki格式的话.它可能诱惑我进入并添加如下内容:
您只能在数字之间放置下划线; 你不能在下列地方放置下划线:
在数字的开头或结尾
与浮点文字中的小数点相邻
在'F'或'L'或'D'后缀之前(我添加'D')
在十六进制和二进制标记'x'和'b'之前或之后
如果你向一个只需要数字的方法提供一个java.lang.String,那么期望在幕后使用的解析算法会抛出一个运行时异常.
顺便说一下,我刚刚在TheServerSide上写了一篇关于这个主题的文章.随意看看.本文旨在获得Oracle认证专家,Java 7程序员认证目标,但它是一篇非常全面且易于阅读的文章,通常只是解释使用下划线的规则.
希望有所帮助.