昨天晚上看了段有意思的代码,今天在网上查询了下相关知识,网上称之为unicode逃逸现象。我们来看看是怎么回事,话不多说,上代码。
- package com.lsl.exam.utils;
-
- public class MyTest {
-
- /**
- * unicode逃逸
- * 有意思的注释
- */
- public static void test1(){
-
- if (true == false){
-
- //注释
- // \u000a\u007d\u007b
- System.err.println("true is false");
- }
-
- String str = "坏人";//\u000d str="好人";
- System.err.println("我是" + str);
-
- }
-
- public static void main(String[] args) {
- test1();
- }
- }
代码很简单,大家猜测下:
第一个输出语句执行了吗?
第二个输出语句输出的是什么?
执行结果如下图:
是不是执行结果有点出人意料,是什么原因造成这个结果呢?关键就在这个注释上,这就是unicode逃逸现象。
我们知道,java编译器会编译代码,除此之外,编译器还会解析unicode码,而\u000a是换行,\u000d是回车。 \u007d是左花括号{, \u007b是右花括号}。那么代码最终就变成了如下:
- package com.lsl.exam.utils;
-
- public class MyTest {
-
- /**
- * unicode逃逸
- * 有意思的注释
- */
- public static void test1(){
-
- if (true == false) {
-
- //注释
- //
- }{
- System.err.println("true is false");
- }
-
- String str = "坏人";//
- str="好人";
- System.err.println("我是" + str);
-
- }
-
- public static void main(String[] args) {
- test1();
- }
- }
这就是代码unicode逃逸现象了。
各位千万不要尝试在代码里写这样的注释,容易挨揍