当我们必须使用 a_
来分隔数字中的数字时,我不明白以下我不能使用它的情况:
在需要一串数字的位置
(如 JDK7 指南中所述)
一些例子?
您不必使用“_”,您可以使用. 提案中给出的示例是信用卡号码、电话号码或简单的数字,在代码中使用分隔符是有意义的。
对于“在需要一串数字的位置”,它只是在它应该以数字开始(或结束)的地方。这里有些例子。
请注意,根据这个提议,下划线只能放在数字之间。它们不能单独放置在通常需要一串数字的位置:
诠释 x1 = _52; // 这是一个标识符,而不是数字文字。
诠释 x2 = 5_2; // 好的。(十进制文字)
整数 x2 = 52_; // 非法的。(下划线必须始终位于数字之间)
整数 x3 = 5_______2; // 好的。(十进制文字。)
诠释 x4 = 0_x52; // 非法的。不能在“0x”基数前缀中添加下划线。
诠释 x5 = 0x_52; // 非法的。(下划线必须始终位于数字之间)
诠释 x6 = 0x5_2; // 好的。(十六进制文字)
诠释 x6 = 0x52_; // 非法的。(下划线必须始终位于数字之间)
诠释 x6 = 0x_; // 非法的。(删除下划线后无效)
诠释 x7 = 0_52; // 好的。(八进制文字)
诠释 x7 = 05_2; // 好的。(八进制文字)
诠释 x8 = 052_; // 非法的。(下划线必须始终位于数字之间)
资源:
正如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;
看起来有人杀死了原始帖子 (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
我也觉得第三点很好奇。我的意思是,在大多数情况下,前三点涵盖了所有场景,那么他们所说的这个神秘的“数字串”是什么?前三点实际上没有解决哪种情况,迫使他们添加这个神秘的第四点?
最初我以为他们在谈论十六进制表示法或二进制表示法,其中 b 或 x 之后应有一个数字,如下所示不起作用:
byte size = 0_b111101; //fail
byte me = 0b_111101; //fail
int hexed = 0_x_BABE; //fail
不过,我认为这在技术上可能与第一点相同,即下划线不能位于数字的开头;但可以肯定的是,在使用二进制或十六进制时,在“b”或“x”之后应该出现“数字串”,对吧?所以如果我是一个赌徒,我可能会在二进制/十六进制场景后面投入一些钱。但我有另一个可能的情况,我可以对冲我的赌注。就这样吧。
就我个人而言,我希望 Java 中有一条规则说在谈论 java.lang.String 时只能使用“字符串”这个词。允许术语“字符串”保留其行人的含义会导致混淆,这是一个很好的例子。
现在,如果第四点说“在需要 java.lang.String 数字的位置”,我可能会得出结论,他们正在谈论代表需要解析的数字的实际 java.lang.String 对象。所以,拿这段代码:
int i = Integer.parseInt("123_456");
那会编译吗?那会跑吗?它将编译得很好,但当然,parseInt 方法需要一个 java.lang.String 数字,并且验证或解析该数字 java.lang.String 将在运行时触发以下错误:
线程“主”java.lang.NumberFormatException 中的异常:对于输入字符串:“123_456”在 java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 在 java.lang.Integer.parseInt(Integer.java:492) 在java.lang.Integer.parseInt(Integer.java:527) 在 Tester.main(Tester.java:7)
当然,这是一个运行时错误,而且 Oracle 文档似乎真的在谈论将在编译时标记的错误。但这肯定是一个需要“数字串”的场景。
现在,如果只有 Oracle 文档是 Wiki 格式。它可能会诱使我进入并添加以下内容:
您只能在数字之间放置下划线;您不能在以下位置放置下划线:
在数字的开头或结尾
与浮点文字中的小数点相邻
在“F”或“L”或“D”后缀之前(我添加了“D”)
在十六进制和二进制标记“x”和“b”之前或之后
而且,如果您向只需要数字的方法提供 java.lang.String,则预计在幕后使用的解析算法会引发运行时异常。
顺便说一句,我刚刚在 TheServerSide 上写了一篇关于这个主题的小文章。随意看看。这篇文章旨在达到 Oracle Certified Professional, Java 7 Programmer 认证目标,但它是一篇非常全面且易于阅读的文章,只是大致解释了使用下划线的规则。
希望有帮助。
您不必在任何地方使用它,但如果需要,您可以在数字文字中的每个数字之间的任何地方使用它。
这对于提高可读性特别有用:
10_000_000_000 // Is equal to 10000000000
7_687_316_418_138_483.345_938 // Is equal to 7687316418138483.345938
不知道,但这是语法,享受。(我在任何地方都看不到“数字串”)
http://download.oracle.com/otndocs/jcp/enhancements-0.875-pr-oth-JSpec/
IntegerLiteral:
DecimalIntegerLiteral
HexIntegerLiteral
OctalIntegerLiteral
BinaryIntegerLiteral
BinaryIntegerLiteral:
BinaryNumeral IntegerTypeSuffixopt
BinaryNumeral:
0 b BinaryDigits
0 B BinaryDigits
DecimalNumeral:
0
NonZeroDigit Digitsopt
NonZeroDigit Underscores Digits
Underscores:
_
Underscores _
Digits:
Digit
Digit DigitsAndUnderscoresopt Digit
DigitsAndUnderscores:
DigitOrUnderscore
DigitsAndUnderscores DigitOrUnderscore
DigitOrUnderscore:
Digit
_
HexDigits:
HexDigit
HexDigit HexDigitsAndUnderscoresopt HexDigit
HexDigitsAndUnderscores:
HexDigitOrUnderscore
HexDigitsAndUnderscores HexDigitOrUnderscore
HexDigitOrUnderscore:
HexDigit
_
OctalNumeral:
0 OctalDigits
0 Underscores OctalDigits
OctalDigits:
OctalDigit
OctalDigit OctalDigitsAndUnderscoresopt OctalDigit
OctalDigitsAndUnderscores:
OctalDigitOrUnderscore
OctalDigitsAndUnderscores OctalDigitOrUnderscore
OctalDigitOrUnderscore:
OctalDigit
_
BinaryDigits:
BinaryDigit
BinaryDigit BinaryDigitsAndUnderscoresopt BinaryDigit
BinaryDigitsAndUnderscores:
BinaryDigitOrUnderscore
BinaryDigitsAndUnderscores BinaryDigitOrUnderscore
BinaryDigitOrUnderscore:
BinaryDigit
_
BinaryDigit: one of
0 1
“在需要一串数字的位置”意味着需要包含数字的 String 类型的变量,然后使用下划线将使下划线成为数字的一部分。例如看下面的代码:
int num = 999_333;
String anum = "999_333";
System.out.println(num); //Outputs 999333
System.out.println(anum); //Outputs 999_333
因此,如果您有一个方法需要一个数字字符串作为参数之一,请不要使用下划线分隔数字,因为它将被视为任何其他字符串。
My interpretation of this is that underscores cannot be placed by themselves in positions where a string of digits would normally be expected:
int x1= _; // Illegal.
我相信预期一串数字的 In 位置涵盖了字符串文字中的转义序列等内容。例如,你不能说\u00_11
.