![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Bug集锦
不要忘了为什么出发
加油吧,小伙!
展开
-
bug集锦
我的职业生涯中写过很多bug,如果你问我哪一个最棒的bug,我会告诉你:下一个!原创 2018-09-19 09:32:38 · 152 阅读 · 0 评论 -
delete方法的规范写法
今天遇到一个细思极恐的问题,就是delete语句。当写delete语句时,一定要谨慎,要对delete感到恐惧!下边是一段无知无畏的代码:这个删除方法代码很好理解,就是将根据条件,拼接一个delete语句,实现按条件删除数据库中记录的SQL。这个方法的非常危险!就是当各个条件都为空的时候,上边的SQL就会是这样,delete from eb_agreement_record w...原创 2018-12-03 18:15:46 · 3109 阅读 · 0 评论 -
快捷键冲突,eclipse ctrl + shift + f快捷键失效
今天想格式化一下代码,使用eclipse的ctrl + shift + f 快捷键,但是发现不起作用。原因是快捷键冲突了,我使用了搜狗输入法,在搜狗输入法中,ctrl + shift + f 用于切换繁简体。解决办法就是,在eclipse中使用ctrl + shift + f 快捷键时,先切换到其他非搜狗输入法就可以了。 ...原创 2018-12-07 12:58:31 · 1206 阅读 · 0 评论 -
Linux headless mode (无头模式)
今天遇到一个问题,把java web 项目部署到客户的服务器上时,登录界面的图片验证码无法显示。经排查发现,java后台代码使用X11GraphicsEnvironment类来生成图片验证码的时候出错了。因为在正常情况下,X11GraphicsEnvironment会调用操作系统的X server来生成图片。但是在操作系统的headless mode下,是没有X server的,所以使用X11Gr...原创 2018-12-23 10:38:21 · 12856 阅读 · 1 评论 -
生成图片验证码报Could not initialize class sun.awt.X11GraphicsEnvironment
今天把java web项目部署到一个新的服务器上时,生成图片验证码报Could not initialize class sun.awt.X11GraphicsEnvironment。经查,服务器所用操作系统是没有GUI的,所以X11GraphicsEnvironment无法调用系统的与图形处理有关的功能,就报错了。解决这个问题,只需在启动java虚拟机的时候,添加一个参数,设置java图...原创 2018-12-23 11:03:48 · 461 阅读 · 0 评论 -
WEB-INF目录名称写错
昨天犯了一个非常低级的错误,在创建WEB-INF目录时,将目录名称写错,结果就导致web.xml文件无法被加载。一开始我还以为是我web.xml文件写的有问题,所以就将问题的排查重点放在对web.xml内容的检查上。浪费了太多时间,最后发现仅仅是目录的名字写错了。可给我气死了,太抓狂了,怒气难消,导致晚上还严重失眠!从这个bug的产生,以及对这个bug的处理上,有三点是要反思的:1.当...原创 2018-12-25 21:18:07 · 269 阅读 · 0 评论 -
‎,这是一个特殊的字符,一个肉眼看不见空字符
今天遇到一个很奇葩的问题,检验UKEY的证书序列号,肉眼看上去明明完全一样的两个证书序列号,但是偏偏就不相等。排查好久,最后终于发现原来是有一个特殊的字符在捣鬼,这个字符完全看不见,而且不占位子。就像这样,两个字符串看上去一模一样,但是有一个看不见的字符,‎在定位这个问题的过程中,浏览器中调试帮我了大忙。如果,我能更善于使用IE8js调试工具,可能就更快的解决这个问...原创 2018-12-25 21:58:08 · 7268 阅读 · 0 评论 -
Ctrl + H 进行全局搜索,定位代码
Eclipse中使用Ctrl + H 进行全局搜索进行是定位代码非常重要且好用的方式。最近几次debug的过程中,发现Ctrl + H是非常好用的,之前对这个功能使用的不够灵活。要注意两点:1.搜索的关键字要足以准确定位代码2.全局搜索代码的唯一方式例如:上次删除冗余代码的时候,在删除某个方法之前,我肯定需要首先判断某个方法是否被调用、在哪里被调用,对于controller中的...原创 2018-12-26 10:04:34 · 2864 阅读 · 0 评论 -
Address already in use: JVM_Bind 端口被占用
在启动Tomcat或者使用SocketServer时,端口已经被占用了,就会报这个错。解决办法很简单:1.换个端口号2.干掉占用端口的jvm进程原创 2019-01-06 10:57:28 · 303 阅读 · 0 评论 -
变量名写错:coding是个精细活
今天,测试同事再进行回归测试时,发现了一个问题,是一个小问题,多亏自己当时没有轻易放过这个问题,仔细看了下代码,原来有个字段的名字拼写错误。我错把企业名称字段赋给了企业id字段。通过这个bug,再次提醒自己,coding是个精细活,一定要注意变量的拼写。...原创 2019-01-14 21:52:25 · 229 阅读 · 0 评论 -
not in (null)导致无查询结果
问题:语句1 :Select * from table1 A where A.col1 not in ( select col1 from table2 B )转载注明出处:http://x- spirit.iteye.com/、http: //www.blogjava.net/zhangwei217245/如果这样,本来应该有一条数据,结果没有。如果...原创 2019-01-14 22:02:40 · 1770 阅读 · 1 评论 -
in与exists执行过程的区别
in 确定给定的值是否与子查询或列表中的值相匹配。in在查询的时候,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。所以相对内表比较小的时候,in的速度较快。相当于一个双重循环,外表是外层循环,内表示内层循环。exists 指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。区...转载 2019-01-14 22:12:13 · 564 阅读 · 0 评论 -
两个list中数据对应关系错乱的bug
看下边这段代码,风险很大。这段代码,接收两个从前端传过来的字符串,一个是供应商企业名称,一个是核心企业名称,都以逗号作为企业名称的分隔符。供应商企业名称与核心企业名称是一一对应的,第0个供应商企业名称与第0个核心企业名称对应,第1个与第1个对应。问题就出在这个名称的对应上,这里风险很大,如果有一个环节企业名称的顺序乱了,那么供应商企业名称与核心企业名称的对应关系就乱了。这里用的是数...原创 2019-01-14 22:39:55 · 789 阅读 · 1 评论 -
边界值处理不当:定价模板边界值处理不当
今天同事遇到一个生产问题,定价模板取值问题。融单系统中的定价模板,是指融资时利率如何取值。例如:(1)当融资金额在[0,10000)这个区间时,利率取2%(2)当融资金额在[10000,20000)这个区间时,利率取2.5%问题就出在边界值这里,当融资金额超过20000万时利率如何取值?同事遇到的问题是,融资金额的最大值设置为1亿,因为当时考虑到单笔融资的金额是不会超过1亿...原创 2019-01-09 22:33:55 · 235 阅读 · 0 评论 -
协议文本错误
涉及到系统中与签署协议有关的功能时,一定要注意协议文本不能出现任何错误,因为协议一旦签署了,就是具有法律效力的,协议文本中出现错误,这是非常麻烦的。协议文本是由法务人员提供的,但是法务人员并不清楚如何在程序中签署协议。当程序员在把法务人员提供的doc协议文本转变成程序中协议文本时,一定不能无脑的复制粘贴,一定得用脑子去看协议的内容。上周同事就遇到一个协议文本出问题的生产bug。大概...原创 2019-01-09 22:53:04 · 237 阅读 · 0 评论 -
Truncated incorrect DOUBLE value错误
sql中update时,为多列设置值时,列与列之间不能用 and ,必须是用逗号sql的update语法错误 eg: update Person set name = ‘auhnayuiL’ and age = 1 where id = 1; 改and为, update Person set name = ‘auhnayuiL’ , age = 1 where id = 1;...原创 2019-01-16 21:59:02 · 16755 阅读 · 0 评论 -
update与delete时,一定不能缺少where条件
在实际开发过程中,update语句和delete语句一定不能缺少where条件,否则会引起非常严重的后果。而且,在代码中对where中条件做非空校验,如果为空就要报异常,一定不能让执行。 ...原创 2019-01-16 22:05:06 · 2846 阅读 · 0 评论 -
当引用类型做方法参数时,修改属性时一定要注意
public void test() { T param = new T(); test1(param); test2(param);}public void test1(T param) { // modify param param.setXxx();}public void test2(T param) { // do something}上例中,在test1()...原创 2018-12-06 10:23:04 · 1391 阅读 · 0 评论 -
变量命名要注意扩展性
变量命名的扩展性,我理解的就是当业务发生变化之后,该变量的命名仍然是适用的。最近在开发中遇到的一个问题就是,定义一个变量,boolean型,用于标志是否需要签署用户服务协议。当前业务需求是,金茂用户、国新用户不需要签署该协议。于是,我这样命名:我直接将该标记变量命名为isJinmaoOrGuoxin,当时的想法就是简单直接,“金茂或国鑫”不用签署用户服务协议,所以就用isJinmaoO...原创 2018-12-03 12:31:17 · 194 阅读 · 0 评论 -
try catch中对捕获到的异常一定要做处理
在catch中捕获到的异常一定要做处理,不能直接return。处理方式:(1)继续抛出(2)打出日志反例:上例中,对捕获到的异常没有做任何处理,这是不合适的,虽然不影响代码的逻辑,但是代码确实出问题了,而又没有将错误内容显示出来,这样会影响代码排除错误。正例:上例中,将捕获到的异常信息打印到日志中,这样就可以在不影响业务逻辑的情况下,还知道出现了什么异常,可以进...原创 2018-12-03 11:22:37 · 13035 阅读 · 1 评论 -
一个不知道怎么描述的bug
bug代码如下图所示:红框中是同一段代码,只是放的位置不同。这段代码的作用就是更新数据库中数据。上边是错误的位置,下边是正确的位置。两个红框之间的代码会操作数据库中的数据,这段代码与红框中的代码操作的是同一条数据。问题就出在这里!如果把红框里的代码写在上边,就会把数据里数据的内容给改了,那接下来的代码再操作这条数据的时候,发现找不到这条数据了。 后记:...原创 2018-09-20 08:13:16 · 470 阅读 · 0 评论 -
使用BigDecimal时,报NumberFormatException
使用BigDecimal时,最常用的用法是传入一个String类型的数值,然后返回一个BigDecimal对象。使用这个构造方法时,如果传入的字符串是一个非法的数值,例如空串、含有字母,这时候就会报异常NumberFormatException。在我工作的过程中,到目前为止遇到的这个异常,都是因为传入的字符串为空串。避免这个问题简单有效的办法,就是做非空校验。(但我总是偷懒,图省事...原创 2018-10-08 08:27:13 · 11601 阅读 · 0 评论 -
导入Excel存在空行,导致NullPointerException
1.情景再现:通过导入Excel文件,导入数据,把这个Excel中的数据处理成一个List,以方便进一步处理,每行数据对应一个List中的元素。但是在处理这个List的时候,报了NullPointerException。2.排查过程:下图为该Excel文件的截图,同过ctrl + end,定位到最后Excel文件使用的最后一个单元格,发现其实第三行是一个空行,只是没有数据,但是这一行是...原创 2018-10-15 22:47:20 · 7006 阅读 · 2 评论 -
拼接SQL的时候,注意SQL片段之间未加空格,导致报错
在开发过程中,根据条件动态拼接SQL,这是一个非常常见的开发情景。要明白一点,以字符串形式,直接拼接的SQL,字符串是什么样子,执行的SQL就是什么样子。所以就要注意避免,拼接的SQL存在语法错误。我之前犯了个错误就是,各SQL之间就没有加空格,当所以SQL最终拼接到一起之后,就会有语法错误。这一点很好理解,小问题,多注意!...原创 2018-10-15 23:02:31 · 1980 阅读 · 0 评论 -
String类型数值与Long类型数值比较是否相等
1.情景再现:有个两表,假如分别叫表A、表B,它们都有一个字段存放着用户id。现在用beanA和beanB来分别来对应表A和表B。然后就判断这连个id字段是否相等,相等则进一步处理。2.bug出现了比较两个id是否相等的伪代码如下:if (beadA.getId().eqauls(beanB.getId())) { //TODO}结果没有任何相等的,但数...原创 2018-10-16 08:27:49 · 5703 阅读 · 1 评论 -
javac 编译时报"编码GBK的不可映射字符"
在用javac 编译java类的时候报“编码GBK的不可映射字符”错误,解决方法是javac -encoding UTF-8 XXX.java,也可以将java文件保存为ANSI格式,继续用javac xxx.java原创 2018-06-23 11:37:24 · 116 阅读 · 0 评论 -
Java:NoClassDefFoundError:can not initialize class XXX原因
问题截图如下:提示无法初始化InvoiceUtil类,这表明InvoiceUtil类在初始化的时候出问题了。经过排查,发现是该类的静态属性在初始化的时候赋值出现问题。InvoiceUtil类中定义了多个静态属性,这些静态属性的值是通过读取配置文件来赋予的。所以由于配置文件的问题,导致该类无法正确初始化。总结:以后遇到类初始化有问题了,注意排查类的静态属性初始化是否有问题。...原创 2018-06-22 13:59:46 · 19432 阅读 · 1 评论 -
Java局部变量不可同名
Java中局部变量只有三种:形参、方法中定义的变量、代码块中定义的变量。如下所示:注意:局部变量的作用域是从该局部变量定义的地方一直到局部作用域结束的地方。例如形参的作用域,就是从方法的第一行代码到最后一行代码。在Java中一定要注意,同名局部变量不存在被屏蔽的问题,只会报错!而C/C++以及其它一些语言对同名局部变量,就是屏蔽处理。反例1:反例2:所以注意了,Ja...原创 2018-10-23 13:03:43 · 1034 阅读 · 1 评论 -
历史数据修复问题
(1)情景再现:开发一个优惠活动有关的功能。原来系统中优惠活动的类型只有一种,叫优惠券。在此基础上要添加一个新的优惠活动类型,叫优惠套餐。那么就需要在原来存放优惠活动的表中增加一个标志优惠活动类型的参数,用于区分是哪种优惠活动。如下图所示:表中新增了一个activity_type字段,用于区分优惠活动类型。(2)bug:由于activity_type字段是新加的,所以对于表...原创 2018-10-21 20:03:21 · 532 阅读 · 0 评论 -
BigDecimal:java.lang.ArithmeticException: Rounding necessary
BigDecimal bd1 = new BigDecimal("1.11");BigDecimal bd2 = new BigDecimal("3.33");// java.lang.ArithmeticException: Rounding necessary// 精度不够,导致存在舍入误差,所以必须得指定取整模式System.out.println("before set scal...原创 2018-11-23 22:22:57 · 826 阅读 · 0 评论 -
BigDecimal:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable
在使用BigDecimal进行除法运算时,一定要注意设置精确度与取整方式,如果没有设置,当遇到除不尽的情况时就会抛这个异常,java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable ,大意就是说得到的是一个没有终止的,不能精确表示的数,通俗的讲就是除不尽。看以下代码:B...原创 2018-11-23 22:38:24 · 367 阅读 · 0 评论 -
模糊查询及日期查询变量命名规范
(1)有时需要进行模糊查询,有时又需要进行精确查询,例如企业名称。这时就不能使用同一个变量,此时应该定义一个用于模糊查询的变量。定义方式,在精确查询的变量后+Like。(2)还有进行日期字段的查询时,有时需要精确查询,有时需要查询某个时间段。当需要查询某个时间段时,需要再定义两个变量,xxxStart表示起始日期,xxxEnd表示终止日期。...原创 2018-12-04 10:23:52 · 1098 阅读 · 0 评论 -
Java私有成员可以被子类继承
之前在看书的是有一直有个错误认识,即私有成员不能被子类继承。私有成员,可以被子类继承,只是在子类中不能直接访问,要在子类中访问父类的私有成员,需要通过父类的可见方法(非private修饰的方法)。构造器是不能被继承的。 ...原创 2018-12-04 16:36:30 · 2224 阅读 · 0 评论 -
Java BigDecimal比较大小
BigDecimal比较大小使用compareTo(BigDecimal)方法。int flag = bigdemical.compareTo(bigdemical1)flag = -1,表示bigdemical小于bigdemical1;flag = 0,表示bigdemical等于bigdemical1;flag = 1,表示bigdemical大于bigdemical1;实际中...原创 2018-12-04 18:28:57 · 57101 阅读 · 0 评论 -
包装类型之间一律使用equals来判断值是否相等
包装类型是引用类型,所以使用==是不能比较包装类型对象包含的值是否相等,==只是比较两个引用变量是否指向相同的对象。由于在jdk1.5之后,支持自动装箱功能,对于Integer会出现下面这种情况:Integer a = 1;Integer b = 1;System.out.println(a == b);// true上述代码中,a == b 结果为true,这只是一个假象,让人...原创 2018-11-27 23:33:59 · 3009 阅读 · 0 评论 -
魔鬼数字
今天优化代码的时候,切实感受到魔鬼数字使代码的可读性变得极差。开发的过程中,通常会使用数字来表示某种跟业务逻辑有关的状态,不同的状态通常对应着不同的处理逻辑。在代码里,就容易出现魔鬼数字的问题。尤其当遇到缺少注释的代码时,代码的可读性就变得很糟,很理解那段代码究竟是要干什么。在代码中使用魔鬼数字(没有具体含义的数字、字符串等)将会导致代码难以理解,应该将数字定义为名称有意义的常量。将数...原创 2018-12-01 17:58:42 · 2769 阅读 · 0 评论 -
mybatis中传入的值始终为null
在service层的orgId、type都是有值的,但是始终查询不到结果,查看sql发现,orgId的值始终为‘null’字符串。困扰了好久,结果发现自己犯了一个非常低级的错误。这里应该使用双等号。...转载 2019-01-28 14:30:10 · 2429 阅读 · 0 评论