语法错误

  • 编译错误

    语义错误

  • 语言细节或者编写出错

  • 算法逻辑错误或遗漏

    运行时错误

  • 并发问题

  • 程序BUG

    中文全角空格

    不可见字符

    包装类 == 与 NPE(空指针)

  • Integer 在 120~ 以上 使用 == 会无效,要用equals

    数据类型与范围

  • System.out.println(1024*1024*1024*4); == 0

    BigDecimal的精度问题

  • 程序不知怎么处理时报异常

  • 超精度和截取

    replaceAll

    1. String name = OptionalTest.class.getName();
    2. System.out.println("name = " + name);
    3. System.out.println("name.replaceAll() = " + name.replaceAll(".","_"));
    4. /**
    5. name = io.tn.test.test.OptionalTest
    6. name.replaceAll() = ____________________________
    7. */

    日期与时间戳

  • System.currentTimeMillis()是不带时区的

    Serializable java原生序列化的坑 CAFE_DEAD

  • 默认 serialVersionUID

  • 加减方法 - 默认序列化版本会变
    • 导致序列化版本对不上序列化不出来
  • 加减字段 - 直接死
  • 所以必须要写serialVersionUID

    • private static final long serialVersionUID = 315654089784739497L;

      重写hashCode和equals

  • 如果equals则hashCode必须相同

  • 如果要比对两个bean是否相等 (值一摸一样),就必须重写

    集合遍历时删除错误

  • 使用Stream+filter

  • 使用待删除列表
  • Iterator.remove迭代器删除

    spring 事务与异步

  • 异步执行

    • 随机报错
    • 事务可能未提交
    • or 事务方法返回之后
  • @Transactiona

    • 默认只对 RuntimeException 错误有效
    • @Transactional(rollbackFor = Exception.class) 对所有异常有效

      资源释放问题

  • 在哪里打开,就在那里关闭

  • 用好 try-finally

    Async 与 线程池

  • 合理规划线程池

  • 线程池要有控制

    • 超时打断等

      ThreadLocal问题

  • 防止污染

  • 防止泄露
  • 适量使用