昨天晚上看了段有意思的代码,今天在网上查询了下相关知识,网上称之为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逃逸现象了。
各位千万不要尝试在代码里写这样的注释,容易挨揍