为什么要在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");
这里发生了什么?
答案 0 :(得分:18)
问题是Unicode替换是在编译的早期完成的。 Unicode转义不仅在字符串和字符文字中有效(如\t
之类的其他转义序列) - 它们在代码中的任何地方有效。它们在规范的不同区域描述 - section 3.3而不是section 3.10.6;只有后者是字符和字符串文字转义序列。
基本上,请阅读规范的第3部分,了解有关词法结构的更多细节:)
所以你的代码实际等同于:
public class Test {
public static void main(String argv[]) {
System.out.println("
");
}
}
...这显然不是有效的代码。对于回车和换行,基本上最好使用“\ r”和“\ n”转义序列。
我个人认为这种处理Unicode转义是Java中的一个缺陷,但我们现在对它的处理并不多:(
答案 1 :(得分:3)
在词法分析之前扩展Unicode转义。 Unicode转义出现在字符串文字中的事实是无关紧要的。 见JLS 3.2。
答案 2 :(得分:1)
这是因为\ u000a = \ n并且编译器处理java源代码以将其转换为标记,因此您不能在代码中使用该unicode字符。 \ u000d = \ r
也是如此答案 3 :(得分:1)
如果我没有弄错,为了避免重新处理,我们可以通过更改以下内容来解决这个问题:
System.out.println((char)10);
限制是,通过成为CHAR
,它的扩展名将为0到255.