2010-10-25 70 views
9

为什么这个编译Java 6中(孙1.6.0_16):解析Java 6字符串文字中的unicode转义问题...?

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

...但不是这样的:

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

在此程序:

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

我得到a

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

这里发生了什么?

回答

17

问题在于编译时很早就完成了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

有人可以根据Jon Skeet的回答提出像可汗学院一样的视频教程。尊重。 – 2010-10-25 08:38:21

+0

非常感谢! – daf 2010-10-25 18:40:44

3

的Unicode转义之前词法分析扩大。 事实上,出现的Unicode转义内文字串是无关紧要的。 参见JLS 3.2。

1

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

1

如果我没有记错的话,避免prepocessing我们可以通过改变线路中解决它:

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

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