10

为什么这会在 java 6 (Sun 1.6.0_16) 中编译:

System.out.println("\u000B");

...但不是这个:

System.out.println("\u000A");

在这个程序上:

public class Test {
  public static void main(String argv[]) {
  System.out.println("\u000A");
  }
}

我得到一个

Test.java:3: unclosed string literal
System.out.println("\u000A");

这里发生了什么?

4

4 回答 4

20

问题是 Unicode 替换是在编译的早期完成的。Unicode 转义不仅在字符串和字符文字中有效(就像其他转义序列一样\t)——它们在代码中的任何地方都有效。它们在规范的不同区域中进行了描述 -第 3.3 节而不是第 3.10.6 节;只有后者是关于字符和字符串文字转义序列的。

基本上,请阅读规范的第 3 节以获取有关词法结构的更多详细信息:)

所以你的代码实际上相当于:

public class Test {
  public static void main(String argv[]) {
  System.out.println("
");
  }
}

...这显然不是有效的代码。对于回车和换行,基本上最好使用“\r”和“\n”转义序列。

我个人认为这种处理 Unicode 转义是 Java 中的一个缺陷,但我们现在对此无能为力:(

于 2010-10-25T08:32:39.437 回答
3

Unicode 转义在词法分析之前被扩展。Unicode 转义出现在字符串文字中的事实是无关紧要的。见 JLS 3.2。

于 2010-10-25T08:34:30.323 回答
1

这是因为 \u000a = \n 并且编译器会处理 java 源代码以将其转换为标记,因此您不能在代码中使用该 unicode 字符。\u000d=\r 也一样

于 2010-10-25T09:08:36.573 回答
0

如果我没记错的话,为了避免预处理,我们可以通过更改以下行来解决它:

System.out.println((char)10);

限制是作为 a CHAR,它的扩展名将从 0 到 255。

于 2012-12-27T10:20:02.760 回答