经典bug
Posted mokayy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典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变量的定义初始化过程是生成一个新对象,并返回这个对象的引用给程序员,程序员可见的都是变量引用,指向一个实际的实体对象。函数传参的操作是复制了一个新的引用,新引用与原引用共同指向实参,在函数内部,将新引用重定向,指向新的对象,实际上对函数外的原引用是不影响的。除非在函数内该变量引用指向对象的属性,在函数外可感知,如果只单纯的改变新引用的指向对象,是不会改变原引用相关的任何信息。
以上是关于经典bug的主要内容,如果未能解决你的问题,请参考以下文章
带权并查集(含种类并查集)经典模板 例题:①POJ 1182 食物链(经典)②HDU - 1829 A bug's life(简单) ③hihoCoder 1515 : 分数调查(示例代码(代