java解惑之字符之谜(谜题15)

谜题15:令人晕头转向的Hello

来看下面这个老生常谈的程序会打印什么?

/*
*Generated by the IBM IDL-to-java compiler,version 1.0
*from F:\TestRoot\apps\a1\units\include\PolicyHome.idl
*Wednessday,June 17,1998 6:44:40 o'clock AM GMT+00:00
*/
public class Test{
	public static void main(String[] args){
		System.out.print("Hell");
		System.out.println("o world");
	}
}


这个程序看起来似乎很简单,就是打印Hello world,但如果真那么简单,那就不能称之为谜题了。实际上,这个程序根本无法通过编译。

问题在于注释的第三行,它包含了字符\units。这些字符以反斜杠(\)以及紧跟着的字母u开头,而这正好表示的是一个Unicode转义字符的开始(\u)。对于Unicode转义字符来说,\u后可接四个十六进制数字(范围是0~65535)。当Unicode转义字符无法转义时,程序就会编译错误。而上面的程序我们可以看出\u后面没有紧跟四个十六进制数字,因此,这个Unicode转义字符是无法转义的,而编译器被要求拒绝该程序,从而导致编译失败。这样的Unicode转义字符也称为是病构的。所以Unicode转义字符必须是良构的,即使出现在注释中也是如此。因为Unicode转义字符是可以出现在程序的任何地方,所以在注释中插入一个良构的Unicode转义字符是合法的,但是几乎没有什么理由会去这么做,除非所写的注释需要有特殊的字符(程序员有时会在javaDoc注释中使用Unicode转义字符来在文档中生成特殊的字符,但在javaDoc注释中更好的是使用HTML实体转义字符来代替Unicode转义字符)。

总之,要确保字符\u不在一个合法的Unicode转义字符上下文之外出现,即使在注释中也是如此。在机器生成的代码中要特别注意此问题。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值