Java 7在数字文字中用下划线表示

xde*_*000 54 java java-7

当我们必须使用_来分隔数字中的数字时,我不理解以下我无法使用它的情况:

在预期有一串数字的位置

(作为记录了JDK7指南这里)

一些例子?

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_; //非法.(下划线必须始终在数字之间)


资源:

  • 医生说:"你只能在数字之间放置下划线; 你不能在下列地方放置下划线:在预期有一串数字的位置.目前尚不清楚这是什么意思.. (3认同)
  • @ColinHebert int x7 = 0_52; 违反了"下划线必须始终在数字之间"这里0是基数前缀rit ..? (2认同)
  • 我不明白“int x7 = 0_52; // OK。(八进制文字)”是如何工作的.. (2认同)

小智 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)

  • @VladIlie连续两次下划线仍然有效. (4认同)
  • 如果两个下划线连续怎么办?即46__12? (2认同)

sim*_*eco 11

TL;TR;

您不必在任何地方使用它,但如果您愿意,您可以在数字文字中的每个数字之间的任何位置使用它

对于提高可读性特别有用

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)


Cam*_*zie 5

看起来有人杀死了原始帖子(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程序员认证目标,但它是一篇非常全面且易于阅读的文章,通常只是解释使用下划线的规则.

OCPJP认证:您需要了解有关带下划线的数字文字

希望有所帮助.