经典bug

1. 变量使用错误,一般为笔误

  本意是剔除自身的奇案8个字符,结果因为取长度是使用错了变量,导致异常

2.异常捕获类异常

  已建立业务类异常,将函数抽出来,加了子线程处理任务,会把原来的业务类异常统一变成了ExecutionException,所以在上游代码里catch不到这个,原来catch的还是creditException,现在改变是把ExecutionException异常catch住,然后返的ExecutionException提取后转成creditException上返

3.redis作计数器使用,实现限制每分钟次数的作用,由于取关键字值和增1期间reids中的数据过期失效,导致增1时没加有效期,永久有效,计数器新时间周期不再清0

  1语句是取该分钟内计数器的数值,2语句是对改数据进行加1。产生问题的前提是:redis的机制,increment函数如果没有对应key就默认初始值为0,再加1,但是这个过程都是默认进行的,没有设置有效期,导致计数值永久有效

 4.Mybatis用于数值类型条件校验规则书写错误导致检验条件失效,导致选取规则未生效。背景:实现重试功能,未重试且已加锁的数据选出一条用于重试。status:0 表示未重试,1 表示重试中, 2 标识重试失败。 isLock: 0 表示未加锁, 1 表示已加锁 。所以是纪要选出来的请求是 status=0 && isLock=1 的请求

数据表类型:

 

修改前的sql:

<sql id="findWhere">
<where>
<if test="ricLogId != null and ricLogId != ''">and ric_log_id like CONCAT('%',#{ricLogId},'%')</if>
<if test="ricTaskCode != null and ricTaskCode != ''">and ric_task_code like CONCAT('%',#{ricTaskCode},'%')</if>
<if test="retryStatus != null and retryStatus != ''">and retry_status = #{retryStatus}</if>

<if test="isLocked != null andÅ isLock != ''">and is_locked = #{isLocked}</if>
    </where>
</sql>

 

实际 retryStatus 和 isLocked 的条件没有生效,因为 这两个变量实际都是 数值型 的,在mybatis中,数值型的变量值为0 等价于 isLock = '',所以实际上两次条件都没有生效

5. java函数形参实参,交换数值失败类问题

下图,典型的函数形参实参,交换数值失败问题,函数传入了一个creditResponse类的creditReport变量。然后在剪头出给该变量重新赋值,但实际对于函数外部来说,这个变量值不会改变。

原因:java变量的定义初始化过程是生成一个新对象,并返回这个对象的引用给程序员,程序员可见的都是变量引用,指向一个实际的实体对象。函数传参的操作是复制了一个新的引用,新引用与原引用共同指向实参,在函数内部,将新引用重定向,指向新的对象,实际上对函数外的原引用是不影响的。除非在函数内该变量引用指向对象的属性,在函数外可感知,如果只单纯的改变新引用的指向对象,是不会改变原引用相关的任何信息。

 

posted @ 2018-02-27 17:18  mokayy  阅读(216)  评论(0编辑  收藏  举报