先上效果图

java的搞笑对话 java恶搞代码_编程语言


可以看到,我们将代码注释掉之后,输出语句依旧执行,代码没有任何问题。

java的搞笑对话 java恶搞代码_编程语言_02


看似没有任何问题的输出语句,却报错,而且提示的错误行数不正确.

这里就涉及到了一个特殊字符:

\u000d

大家可以将这个字符复制到注释后面,观察程序运行效果,发现注释掉的语句仍然可以正常执行!

所以这就有了很多骚操作

我这里先使用一个冒泡排序算法来代替项目中的代码逻辑:

java的搞笑对话 java恶搞代码_编译器_03

1.我们可以将程序中的一些关键业务代码“注释”掉:

java的搞笑对话 java恶搞代码_java的搞笑对话_04


2.我们甚至可以将小括号大括号和关键字“注释”掉:

java的搞笑对话 java恶搞代码_编码学_05


3.甚至连关键字,变量声明,特定的一些结构我们都可以“注释”掉:

java的搞笑对话 java恶搞代码_java的搞笑对话_06

4.类名方法名算什么,统统注释掉:

java的搞笑对话 java恶搞代码_编码学_07

最后,来一张终极恶搞版:

java的搞笑对话 java恶搞代码_java的搞笑对话_08


这时有人说了:

哎呀你这个这么多错误,肯定运行不起来的啦,连上方运行按钮都叉掉了~

java的搞笑对话 java恶搞代码_java的搞笑对话_09


令人震惊的是,他确确实实是可以运行的~

这时又有人说:
哎呀这个你肯定是缓存了之前编译好的程序,执行的都是以前的拉~

那我们就在程序中改变几行代码,加几条输出语句

java的搞笑对话 java恶搞代码_java的搞笑对话_10


java的搞笑对话 java恶搞代码_编程语言_11

所以我们可以证明,即使程序看起来不像样子,但它真真正正的是可以运行的~

而且我们上述程序中,虽然被我们改的不成样子,但是其实我们并没有破换程序结构,如果破幻,是无法运行的!

我们随便写两句不符合规定的语句:

java的搞笑对话 java恶搞代码_编程语言_12


java的搞笑对话 java恶搞代码_java_13


利用这一点,我们甚至可以将真正的注释破换成不符合规定的语句,混在程序代码中(滑稽):

java的搞笑对话 java恶搞代码_编码学_14


有些注释,看似是注释,实则…呃~

解释一下原理:

说了这么多,我们这个字符为什么可以有这么大的魔力呢

我们经常可以在程序中看到以下注释:

java的搞笑对话 java恶搞代码_java的搞笑对话_15

其实这些注释就是我们所说的unicode编码,是文件保存编码不一致导致的!

而我们的:\u000d也是一个unicode编码,转换后为换行符!

所以…

其实Java在编译过程中是识别这些unicode编码的,并且编译这些unicode编码是会被识别的,即便它存在于注释之中…

所以我们上图中代码看似错误,实则为:

java的搞笑对话 java恶搞代码_编码学_16


这样就能看明白了吧,代码看似混乱,实则没有一处编译错误,所以程序能正确执行啦!

滑稽:

鲁迅说过:如果程序员想要自己无法被替代,就写一些让别人无法维护的程序~

这个帖子估计会在这一点上帮助你很多~

java的搞笑对话 java恶搞代码_编码学_17

最后说一句:被打了别找我~