Java 6字符串字面量中解析Unicode转义字符出现问题...?

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个回答

20
问题在于Unicode替换在编译过程中非常早地进行。Unicode转义不仅仅在字符串和字符字面量中有效(如其他转义序列,例如\t),它们在代码的任何位置都是有效的。它们在规范的不同区域中描述 - 第3.3节而不是第3.10.6节;只有后者涉及到字符和字符串文字转义序列。

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

所以你的代码实际上等价于:

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

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

个人认为Java处理Unicode转义的方式存在缺陷,但现在我们无法做太多事情:(


3
有人可以根据Jon Skeet的回答制作视频教程系列,就像可汗学院一样。表示尊敬。 - Boris Pavlović

3
Unicode转义在词法分析之前被展开。Unicode转义出现在字符串字面量中是无关紧要的。请参见JLS 3.2。

1

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


0

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

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

限制在于它是一个CHAR,其扩展范围为0到255。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接