[英]Problem parsing unicode escape in a Java 6 String literal…?
为什么要在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并且编译器处理java源代码以将其转换为标记,因此您不能在代码中使用该unicode字符。 \\ u000d = \\ r \\ n也一样
如果我没有弄错,为了避免预处理我们可以通过更改以下行来解决它:
System.out.println((char)10);
限制是通过成为CHAR
,它的扩展名将从0到255。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.