编码编成翔的十八般兵器 1. 块里堆上我满满的翔 2. 把翔藏在注释里,有时候它会“惊艳”了世界 3. 我家大门常打开,欢迎错误走进来 4. 我抓到了异常,但是我不想处理了,因为我要离职了 5. 只要我不考虑任何意外的情况,那么项目就一定会出意外 6. 我要把方法里可能的异常藏起来不告诉任何人 7. 我不走正道,因为我是个光荣的产翔侠 8. 为了我走之前不出意外,我要捕获所有的 NPE 9. 一个方法我如果写成一万行,公司一定会倒闭的 10. 我要把所有业务逻辑都揉进几个类里,就好像女友第一次来我家 11. 是男人就来看我继承一百层类 12. 如果我不用缓存,我就能多浪费公司的几台服务器 13. 线程安全?那是什么?能吃吗? 14. 在我手中无物不锁 15. 我只知道 ArrayList,LinkedList 它配我用吗? 16. 我的方法里有无数的参数,也许里面需要一个宇宙 17. 递归里偷偷抹掉出口条件,就让服务器的 CPU 燃烧殆尽吧 18. 如果我不关闭资源,那么我就能让公司多花些内存钱

程序员最怕读别人的代码,比这个更可怕的是什么?

从别人那里接手一个老项目

别问为什么,并且不接受反驳。

前任程序员或者是编码能力不行,或者是跳槽之前故意摆烂……于是,一个隐藏着一堆烂摊子的项目,扔给了后来接手的人。

本来以前是代码里夹翔,后来就是翔夹代码了。

这些翔有各种各样的风味,其中就有那么十八种味道最是冲人。

Java 中有着无数的语句块,这些语句块可以嵌套。于是我们有很多优秀的产翔大师会在这些语句块中不断地嵌套,犹如无数层的俄罗斯套娃。
编码编成翔的十八般兵器
1. 块里堆上我满满的翔
2. 把翔藏在注释里,有时候它会“惊艳”了世界
3. 我家大门常打开,欢迎错误走进来
4. 我抓到了异常,但是我不想处理了,因为我要离职了
5. 只要我不考虑任何意外的情况,那么项目就一定会出意外
6. 我要把方法里可能的异常藏起来不告诉任何人
7. 我不走正道,因为我是个光荣的产翔侠
8. 为了我走之前不出意外,我要捕获所有的 NPE
9. 一个方法我如果写成一万行,公司一定会倒闭的
10. 我要把所有业务逻辑都揉进几个类里,就好像女友第一次来我家
11. 是男人就来看我继承一百层类
12. 如果我不用缓存,我就能多浪费公司的几台服务器
13. 线程安全?那是什么?能吃吗?
14. 在我手中无物不锁
15. 我只知道 ArrayList,LinkedList 它配我用吗?
16. 我的方法里有无数的参数,也许里面需要一个宇宙
17. 递归里偷偷抹掉出口条件,就让服务器的 CPU 燃烧殆尽吧
18. 如果我不关闭资源,那么我就能让公司多花些内存钱

2. 把翔藏在注释里,有时候它会“惊艳”了世界

有些哥们儿很鸡贼的把一些代码藏在注释里,这些代码可以随时成为定时炸弹。

public static void main(String[] args) {
  String a = "Hello";
  // u000d a="world";
  System.out.println(a);
  // u000a a="hello world!";
  System.out.println(a);
}

上面这段代码运行之后,说好的“Hello”呢?

world
hello world!

3. 我家大门常打开,欢迎错误走进来

在 Java 中,如果你想接手一个项目,看到一个父类的字段是非 private 的,而子类还存在同名字段,要注意了,这个项目的前任可能比较渣,你可能会恼火的想给他烧纸。比如:

public class Base {
  public int field = 0;

  public int getField() {
    return field;
  }
}
public class Sub extends Base {
  public int field = 1;

  public int getField() {
    return field;
  }
}

你这样测试下看看

public static void main(String[] args) {
  Sub s = new Sub();
  Base b = s;

  System.out.println(s.field);

  System.out.println(b.field);

  System.out.println(((Sub) b).field);

  System.out.println(((Base) s).field);
}

4. 我抓到了异常,但是我不想处理了,因为我要离职了

有些哥们儿走之前可能人未动心已远,也可能是懒的处理异常,他会给你留下一个谜之空白。

public class EmptyCatchBlockTest {
  public static void main(String[] args) {
    try {
      int a = 4, b = 0;
      int c = a/b;
    } catch(ArithmeticException ae) {
      // ???
    }
  }
}

对不起,兄弟,你留下这种薛定谔的处理是想让人帮你掀桌吗?

5. 只要我不考虑任何意外的情况,那么项目就一定会出意外

有些直性子的人,认为天下万物都可以直来直去,就好像直男只会让女生“多喝热水”一样。所以,他们写的代码非常直率,直接就不考虑意外情况。

  public static void main(String[] args) {
    int a = args.length;
    int b = 42 / a;

    if (a == 1) {
      a = a / (a - a);
    }
    if (a == 2) {
      int c[] = {1};
      c[42] = 99;
    }
}

上边的代码很直率,既不考虑 a 可能为 0 的情况,也不考虑数组越界。直来直去,就好像“我不尴尬,尴尬的就是别人”。

6. 我要把方法里可能的异常藏起来不告诉任何人

还有些哥们也不知道是不是有什么见不得人的事情,该抛出来的异常从来不抛出来,导致你根本不知道发生了什么事情。

InputStream is = null;
try {
  is = new FileInputStream("一个文件.txt");
} catch (FileNotFoundException e) {

}

int b;
try {
  while ((b = is.read()) != -1) {
  }
} catch (IOException e) {
  e.printStackTrace();
} finally {
  try {
    is.close();
  } catch (IOException e) {
    e.printStackTrace();
  }
}

上面的代码里,如果文件找不到,接手人要撞墙的。

7. 我不走正道,因为我是个光荣的产翔侠

还有些人,不知道从哪里学会的邪门歪道,喜欢通过在捕获异常里写业务逻辑。对这种人,你九阴真经练成了梅超风啊。

public DateTime override Add(TimeSpan ts) {
  try {
    return base.Add(ts);
  }
  catch (ArgumentOutOfRangeException nb) {
    // calculate how much the MaxValue is exceeded
    // regular program flow
    TimeSpan saldo = ts - (base.MaxValue - this);
    return DateTime.MinValue.Add(saldo)
  }
  catch(Exception anyOther) {
    // 'real' exception handling.
  }
}

我就想问问,如果以异常来控制流程,那么如何在这些异常中寻找真正的异常情况?

8. 为了我走之前不出意外,我要捕获所有的 NPE

有些哥们儿会把 NPE 捕获住,恩,不解决问题,但是把提出问题的人给解决了。

private static void callInstanceMethodOfNull() {
  try {
    Integer age = null;
    age.toString();
  } catch (NullPointerException exception) {
    Logging.log(exception);
  } catch (Throwable exception) {
    Logging.log(exception, false);
  }
}

但是呢,这在正常的业务逻辑里很可能就把别人坑了,因为 Null 本身就是代表着一种非法状态。拿着前朝的剑斩今朝的官,包大人干的好啊。

9. 一个方法我如果写成一万行,公司一定会倒闭的

有些朋友可能有分离焦虑症,一个方法里能写上 1 万行代码。对不起,读书读几页都会犯困,读你这一万行代码……

10. 我要把所有业务逻辑都揉进几个类里,就好像女友第一次来我家

有些哥们,你看看他负责的项目,你发现整个项目没几个类。你很纳闷,觉得业务很复杂,竟然可以实现的如此简单吗?你再打开他的类看源码,哦豁,这就是个垃圾箱啊,什么都能往里塞啊。

哥们儿,这不是女朋友去你租的房子里,你为了显得干净,把你那些垃圾到处塞啊。

11. 是男人就来看我继承一百层类

有些爷爷不知道怎么想的,在他们眼里可能只有儿子和老子,一个类很不得搞一百层的类继承。你这样继承,您家万贯家财还能遭得住吗?

12. 如果我不用缓存,我就能多浪费公司的几台服务器

还有些哥们儿,明明知道他这个功能可能被频繁访问,比如登录的时候查相关的白名单、黑名单。哥儿们儿知道并发量大,可从来不想套个缓存,就是死从数据库里要数据。数据库想:生产队的驴也没我这么忙啊。

13. 线程安全?那是什么?能吃吗?

有些号称老程序员的老司机们,经年有余的不管线程安全。上来口吐异步同步,可是到手上了,线程就是个后娘养的,不管人家的数据安全了。合着身前叫人家小甜甜,落地了叫人家牛夫人了?

14. 在我手中无物不锁

还有些哥们儿,怕线程跟怕老婆一样,一旦可能多线程了,上来先上个同步锁。你打开他写的代码,十个方法十把锁。于谦儿这种大户人家也不带这样上锁的啊。

15. 我只知道 ArrayList,LinkedList 它配我用吗?

有些兄弟可能只知道 ArrayList 能放东西。就算需要动态调整的场景,哥们儿也从不考虑 LinkedList。系统慢的跟龟爬一样,愣是说系统遇到瓶颈。

16. 我的方法里有无数的参数,也许里面需要一个宇宙

有些程序大师,他需求可能比较多,性格比较贪婪。写的方法也跟性格一样邪恶,一个方法需要的参数,从天上到地下,什么都需要。你要调他的方法,就跟有个黑洞吸住你不放一样,陷进去你就出不来了。放我去飞好不好?

17. 递归里偷偷抹掉出口条件,就让服务器的 CPU 燃烧殆尽吧

有时候看到没有出口的递归方法,你就知道,写这段代码的人的人生是多么悲催,他悲惨的连测试都不敢,生怕碰伤了自己。没有出口的递归,就跟没有出路的人生一样。

18. 如果我不关闭资源,那么我就能让公司多花些内存钱

用了资源您不释放,您是嫌山上的笋不够采,下山来夺笋了吧。行行好,放了那个资源吧。

得,看到了这里,列位看官看个乐就行了,希望诸位千万别使用这十八般兵器。


你好,我是四猿外。

一家上市公司的技术总监,管理的技术团队一百余人。

我从一名非计算机专业的毕业生,转行到程序员,一路打拼,一路成长。

我会通过公众号,
把自己的成长故事写成文章,
把枯燥的技术文章写成故事。
编码编成翔的十八般兵器
1. 块里堆上我满满的翔
2. 把翔藏在注释里,有时候它会“惊艳”了世界
3. 我家大门常打开,欢迎错误走进来
4. 我抓到了异常,但是我不想处理了,因为我要离职了
5. 只要我不考虑任何意外的情况,那么项目就一定会出意外
6. 我要把方法里可能的异常藏起来不告诉任何人
7. 我不走正道,因为我是个光荣的产翔侠
8. 为了我走之前不出意外,我要捕获所有的 NPE
9. 一个方法我如果写成一万行,公司一定会倒闭的
10. 我要把所有业务逻辑都揉进几个类里,就好像女友第一次来我家
11. 是男人就来看我继承一百层类
12. 如果我不用缓存,我就能多浪费公司的几台服务器
13. 线程安全?那是什么?能吃吗?
14. 在我手中无物不锁
15. 我只知道 ArrayList,LinkedList 它配我用吗?
16. 我的方法里有无数的参数,也许里面需要一个宇宙
17. 递归里偷偷抹掉出口条件,就让服务器的 CPU 燃烧殆尽吧
18. 如果我不关闭资源,那么我就能让公司多花些内存钱

我建了一个读者交流群,里面大部分是程序员,一起聊技术、工作、八卦。欢迎加我微信,拉你入群
编码编成翔的十八般兵器
1. 块里堆上我满满的翔
2. 把翔藏在注释里,有时候它会“惊艳”了世界
3. 我家大门常打开,欢迎错误走进来
4. 我抓到了异常,但是我不想处理了,因为我要离职了
5. 只要我不考虑任何意外的情况,那么项目就一定会出意外
6. 我要把方法里可能的异常藏起来不告诉任何人
7. 我不走正道,因为我是个光荣的产翔侠
8. 为了我走之前不出意外,我要捕获所有的 NPE
9. 一个方法我如果写成一万行,公司一定会倒闭的
10. 我要把所有业务逻辑都揉进几个类里,就好像女友第一次来我家
11. 是男人就来看我继承一百层类
12. 如果我不用缓存,我就能多浪费公司的几台服务器
13. 线程安全?那是什么?能吃吗?
14. 在我手中无物不锁
15. 我只知道 ArrayList,LinkedList 它配我用吗?
16. 我的方法里有无数的参数,也许里面需要一个宇宙
17. 递归里偷偷抹掉出口条件,就让服务器的 CPU 燃烧殆尽吧
18. 如果我不关闭资源,那么我就能让公司多花些内存钱