
开篇
一切都源于那个无聊的下午。
我正在上班划水,用着最新的 Trae 进行编码工作,我本来是打算使用 Trae 写一个命令行工具的,写着写着,发现 Trae 还是很能够理解程序员的意图,它不仅能够自动的生成我们想要的代码,同时在修改的时候,也明白优化的目的,我的工作变得慢慢简单起来,就是不断给提示词优化代码。
我突发奇想,既然 Trae 这么了解我们,那是不是也能写出一些 Bug 代码?
于是我敲出了一段提示词:
请你写出 10 则你觉得最好笑的 Kotlin/Java 代码笑话
下面,就是 Trae 的笑话时刻。
无限递归的自我介绍
Kotlin
fun introduceMyself() {
println("我是一名程序员")
println("想了解更多关于我的信息吗?")
introduceMyself() // 无限递归,永远介绍不完自己
}
笑点分析
虽然这个看起来是个冷笑话,不过我相信很多开发者,尤其在编写算法类代码的时候,肯定写过类似的无限递归 Bug。
该 Bug 主要是因为没有设定停止条件。
除此之外,Kotlin 还支持一个递归优化------尾递归。
上述代码如果我们转译成 Java 代码,是这样的:
Java
public static final void introduceMyself() {
System.out.println("我是一名程序员");
System.out.println("想了解更多关于我的信息吗?");
introduceMyself();
}
而我们使用尾递归,
Kotlin
tailrec fun introduceMyself()
转译的代码就是:
Java
public static final void introduceMyself() {
while(true) {
System.out.println("我是一名程序员");
System.out.println("想了解更多关于我的信息吗?");
}
}
优化的代码没有多余的函数调用,同时也没有递归造成的栈溢出问题。
Kotlin 确实懂我们。
极度乐观的异常处理
Kotlin
try {
// 一些可能出错的代码
riskyOperation();
} catch (Exception e) {
// 假装什么都没发生
System.out.println("这里没有bug,请继续");
}
笑点分析
如果代码出现异常,那么我们就 catch
一下。
我曾经在开发安卓 App 的时候,为了让应用发生不崩溃,就用了类似的方式,不过那个比这个麻烦一点。首先是捕获主线程的异常,然后让主线程的 Looper
继续运转,大概这个逻辑。
单说异常的处理,Kotlin 也有相关的内置组件,详情看这里。
过度防御性编程
Kotlin
fun isUserLoggedIn(): Boolean {
if (user != null && user.isLoggedIn == true && user.session != null &&
user.session.isActive == true && user.session.isExpired == false &&
user.account != null && user.account.isBanned == false &&
System.currentTimeMillis() < user.session.expiryTime &&
!user.name.isNullOrEmpty()
) {
return true
} else {
return false
}
}
笑点分析
老实说,我觉得这段代码没有什么大毛病。
当然它依然是可以优化的:
Kotlin
fun isUserLoggedIn(): Boolean {
return user != null && user.isLoggedIn && user.session != null && user.session.isActive && !user.session.isExpired && user.account != null && !user.account.isBanned && System.currentTimeMillis() < user.session.expiryTime && !user.name.isNullOrEmpty()
}
简洁多了!当然,如果能把条件拆分,就更好了。
神秘的变量命名
Kotlin
int a = 5;
int b = 10;
int x = a + b;
// 几百行代码后...
if (x > 10) { // 这里的x是什么来着?
doSomething();
}
笑点分析
哈哈······
我承认,我笑了一下,这种类似的写法,很多开发者应该都写过。
代码段长度一旦超过一个屏幕,安能辨我是雌雄!
过度工程化的 Hello World

Kotlin
class HelloWorldFactory {
companion object {
fun createHelloWorldPrinter(): HelloWorldPrinter {
return HelloWorldPrinterImpl()
}
}
}
interface HelloWorldPrinter {
fun printHelloWorld()
}
class HelloWorldPrinterImpl : HelloWorldPrinter {
override fun printHelloWorld() {
println("Hello, World!")
}
}
fun main() {
val printer = HelloWorldFactory.createHelloWorldPrinter()
printer.printHelloWorld()
}
笑点分析
我确实笑了,但随即,我戴上了痛苦面具。
作为 Kotlin/Java 开发者,我知道 Java 在外的名声------过度抽象。我在一个开发者论坛上看过类似的帖子,内容就是你能一眼看出有 Java 代码经验的人的代码------起手就是一个抽象类!
个人来讲,确实 Java 有这个问题,哈哈。
过度抽象,俨然成为了 Java 开发者的刻板印象。
魔法数字大师
Kotlin
public int calculateTotal(int quantity) {
return quantity * 7 * 24 * 60 * 60 * 1000; // 什么意思?没人知道!
}
笑点分析
虽然我一眼就能看出这段代码的意思是返回 quantity
周的毫秒数,但是平时代码这么写,多半是要挨打的!
最好的方式就是放到一个常量中,给变量一个有意义的名字。
Kotlin
const val WeekInMillis = 7 * 24 * 60 * 60 * 1000
永远不会执行的代码
Kotlin
fun processData(data: List<String>) {
if (1 == 2) { // 永远为false
println("这段代码永远不会执行")
} else {
println("总是执行这里")
}
}
笑点分析
这段代码多半是因为开发者喝假酒了!
令人困惑的布尔表达式

yaml
val isEligible = !(!isAdult || !hasPermission) && !(isBlocked &&
!isSpecialCase) || isAdmin
// 祝你好运理解这个条件
笑点分析
这表达式,没有注释是真看不懂。
作为开发者,一定要避免这么写布尔表达式,通常布尔表达式条件超过三个后,可读性就大大降低了。
这里最好的方法是将每个条件单列出来,然后给一个有意义的变量名。
Kotlin
val legalAdult = isAdult && hasPermission
val notBlocked = !(isBlocked && !isSpecialCase)
val isEligible = legalAdult && notBlocked || isAdmin
注释比代码多
kotlin
// 这个函数用于将用户输入的字符串转换为整数
// 首先检查字符串是否为空
// 然后尝试将其解析为整数
// 如果解析失败,返回默认值0
// 参数: input - 用户输入的字符串
// 返回: 解析后的整数,或者在解析失败时返回0
// 作者: 某某某
// 创建日期: 2023-01-01
// 最后修改: 2023-02-15 - 添加了空检查
fun parseInteger(input: String): Int {
return input.toIntOrNull() ?: 0
}
笑点分析
emmmm,TRAE 一天都是在分析什么代码?
但是不得不说,写注释,是划水的最好借口,你总不能说我没干活儿吧!
过度使用 Elvis 运算符
kotlin
fun getUserInfo(): String {
return user?.name?.firstName ?: user?.name?.nickname ?: user?.username ?:
user?.email?.split("@")?.get(0) ?: user?.phoneNumber?.toString() ?:
user?.id?.toString() ?: "未知用户" // Elvis运算符地狱
}
笑点分析
这个才是属于 Kotlin 独有的地狱笑话!
如果 Elvis 表达式实在是太长了,建议还是使用 if-else
。
总结
以上,便是 TRAE 给我写的十则笑话。
其实大部分都是我们平时会遇到的代码片段,曾经的我们写过,将来的他们,也依然会写。
代码写错并不可怕,不断学习,不断优化才最重要。
还有一则
在结束的时候,TRAE 又来了一则笑话!

