「Java」惊!Java里面注释的代码居然被执行了

文章图片

文章图片
背景
最近同事写的程序报了一个非常神奇的错 , 错误信息如下:
喊我一起去解决这个问题 , 看到这个错误的时候 , 我首先去搜\"\\uff0c\"这个字符串 , 居然没有搜到 , 然后查看的报错的代码位置 , 发现也是正常的 , 代码如下:
看上去这是一个很正常的代码 , 没有任何问题 , 但是报错位置在这里 , 经过我逐行的排查 , 发现问题出现在第二行的注释上面 , 删掉这行代码就会没有任何问题出现 , 难道是注释里面的代码被执行了吗?
经过我上网查询了相关资料 , 发现原因是Unicode解码发生在任何词汇解码之前 。 而 \\u000d 是一个换行符 , 因此对注释进行了终止导致换行符后面的注释代码被执行了 。 为了证明这一点 , 我写了个Demo , 代码如下:
执行后结果为:Hello World!
上面的代码等效于下面的代码:
上面问题引申出一个概念“Unicode 逃逸”
那么什么叫Unicode 逃逸我去 oracle 官网查看了一下 Java 语言规范(JLS 3)相关的解释 , 大意如下:Unicode 转义用于表示仅包含 ASCII 字符的 Unicode 符号 。 当您需要插入无法在源文件的字符集中表示的字符时 , 它将派上用场 。 JLS 3.3节的相关说明 , Unicode 转义包含一个反斜杠字符(\\) , 后跟一个或多个'u'字符和四个十六进制数字 。
因此 , 例子中的 \\u000d将被视为换行符 。
为什么会有这种机制 , 有什么作用这种机制的好处在于它可以在 ASCII 和任何其他编码之间来回切换 , 并且不需要你弄清楚注释的开始和结束位置!
总结
这种方式体现了Java核心的思想 —— 平台一致性 。
【「Java」惊!Java里面注释的代码居然被执行了】虽然这种处理方式看似很好 , 其实 , 它却带来了副作用(干扰语义) , 尤其是在文章或者评论中 , 我们一定要注意这样的“特殊字符”带来的Bug 。
推荐阅读
- 程序员■Java程序员必知:HashMap进行put操作会不会引起死循
- 课工场郑州翔天信鸽|JavaScript最常用,java是主流,JetBrains公布编程语言排名
- 猿灯塔|POI Excel,Java架构-Apache
- 【Java】github上标星70.5k,贼火的Java突击手册,全面详细对标阿里P7
- 「编程」后台编程语言互相争执,为何前端公认JavaScript?
- 腾讯@JAVA如何连接数据库
- 『迷魂』中国最“神秘”的3个地方,里面发现的很多怪事,科学都解释不了
- Java■Java仍然排名第一,但Kotlin不容小视了
- 「javascript」为什么NodeJS是创业公司的首选?了解用于Web开发的NodeJS
- 人世繁华|进行面向对象程序设计深剖,可以一学,大牛带你深入Java核心技术
