为什么在 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");

这里发生了什么?

有帮助吗?

解决方案

的问题是,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中的漏洞,但不是很多,我们现在可以做些什么:(

其他提示

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

这是因为\ u000a = \ n和编译过程中,为了将其转换为记号,所以在你的代码中不能使用Unicode字符的Java源代码。同样为\ u000d = \ r

如果我没有记错的话,避免prepocessing我们可以通过改变线路在解决这个问题:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top