Db.find可能出现的空指针问题

业务场景是根据ID等查询某条数据,忽然ID穿了一个null,然后就出现了错误,代码如下

        Db.find("SELECT * FROM `test` where id=? ",null);

debug到下面方法发现出现了java.lang.NullPointerException错误

image.png

然后测试传2个null的时候

Db.find("SELECT * FROM `test` where id=? and name=?",null,null);

发现两个空值没问题

image.png

目前先通过继承MysqlDialect解决了问题,希望这块修复下

image.png

评论区

小小魔炎

2019-12-18 17:29

Object... paras 是可变参数
传一个null时,会被解析成为数组paras = null,引发空指针;
传两个null时,会被解析成为数组paras = {null, null},就不会空指针了

实际常用到的就是Db.findById()
而且sql中一般都是写“WHERE id IS NULL”而不会写“WHERE id = NULL”

这样测出的bug的方式也是刁钻啊

无翼

2019-12-18 17:31

@小小魔炎 不是ID,可能是别的值,拿ID举个例子,希望如果为null执行sql and xxx=null 而不是空指针

小小魔炎

2019-12-18 17:37

@无翼 sql中一般都是写“WHERE name IS NULL”而不会写“WHERE name = NULL” ,我刚测过两种sql查询出来的结果是不一样的,“IS NULL”才是这个场景想要的结果,你可以试试

小小魔炎

2019-12-18 17:59

@无翼 Db.find("SELECT * FROM `test` where name IS NULL ");
只能这样写了,不需要用到paras

无翼

2019-12-18 18:42

@小小魔炎 业务逻辑是想要 name等于一个值,因为各种原因name传递过来一个null,希望查询出来一个null返回给前台,而不是报错,并不是想要name等于null

JFinal

2019-12-18 19:37

@无翼 这里改进一下可能会更好,谢谢你的建议

你暂时通过继承 MysqlDialect 来解决,也相当方便

JFinal

2019-12-18 19:51

刚刚在本地测试了一下,如果使用变量的话不会出现你碰到的情况,例如:
Db.find("SELECT * FROM `test` where id=? ", id);

当参数直接使用 null 值常量的时候才会出现异常:
Db.find("SELECT * FROM `test` where id=? ", null);

而这种使用 null 常量作为 Object... paras 参数的情况是极少的,当然,添加一个 if 判断会更好

希望你在本地再测试一下,看你那里的情况是不是与我说的完全一致,或许你那里的情况更加特别

热门反馈

扫码入社