当前使用版本(必须填写清楚,否则不予处理)
3.2.0
该问题是怎么引起的?(最新版上已修复的会直接close掉)
使用条件构造器时, 当 condition 为 false 时, 后面的代码仍然会被执行, 导致报了 npe. StringUtils.isNotEmpty(name) 是 false, 但是后面的 name.trim() 还是会被执行, 不太理解这里. 正常情况我以为是直接 name.trim() 的逻辑, 请问下如果我确实是想实现这个 trim 的逻辑, 要具体怎么写
重现步骤
String name = null;
List<UserPo> list = userService.lambdaQuery()
.eq(StringUtils.isNotEmpty(name), UserPo::getName, name.trim())
.list();
报错信息
java.lang.NullPointerException
Comment From: miemieYaho
这属于java知识,自己去研究
Comment From: garzekangba
当前使用版本(必须填写清楚,否则不予处理)
3.2.0
该问题是怎么引起的?(最新版上已修复的会直接close掉)
使用条件构造器时, 当 condition 为 false 时, 后面的代码仍然会被执行, 导致报了 npe. StringUtils.isNotEmpty(name) 是 false, 但是后面的 name.trim() 还是会被执行, 不太理解这里. 正常情况我以为是直接 name.trim() 的逻辑, 请问下如果我确实是想实现这个 trim 的逻辑, 要具体怎么写
重现步骤
String name = null; List<UserPo> list = userService.lambdaQuery() .eq(StringUtils.isNotEmpty(name), UserPo::getName, name.trim()) .list();报错信息
java.lang.NullPointerException
你好,我也有同样的困惑,请问您解决了吗
Comment From: ac3than
当前使用版本 (必须填写清楚, 否则不予处理)
3.2.0
该问题是怎么引起的?(最新版上已修复的会直接 close 掉)
使用条件构造器时, 当 condition 为 false 时, 后面的代码仍然会被执行, 导致报了 npe. StringUtils.isNotEmpty(name) 是 false, 但是后面的 name.trim() 还是会被执行, 不太理解这里. 正常情况我以为是直接 name.trim() 的逻辑, 请问下如果我确实是想实现这个 trim 的逻辑, 要具体怎么写
重现步骤
String name = null; List<UserPo> list = userService.lambdaQuery() .eq(StringUtils.isNotEmpty(name), UserPo::getName, name.trim()) .list();报错信息
java.lang.NullPointerException
你好, 我也有同样的困惑, 请问您解决了吗
我的理解是 name.trim()这句代码其实一定会在eq()方法执行前, 先被执行. 因为他是作为方法的参数传过来的, 这有点类似于 str.substring(str.indexOf('team')) 其中 indexOf 方法的返回值作为方法参数一定在 substring 之前被执行了~~
如何解决: 可以自己封装一个trim方法,
private String trim(String str) {
if (str == null) {
return null;
}
return str.trim();
} , 然后 .eq(StringUtils.isNotEmpty(name), UserPo::getName, trim(name))
应该就不会报 npe 了, 不知道你有什么看法, 欢迎交流
Comment From: lcy19
自己也遇到了对应的问题,最开始的想法是wrapper的condition判断如果为false,后面的逻辑,如name.trim在编译和运行的时候都不会再执行,如同if条件判断中的短路效应,但看起来不是的。应该是即便wrapper的condition条件添加了非空判断,后面的name.trime也会被执行,不过wrapper起到的作用是在condition为false的情况下,不会将这个条件附加到sql语句上。
Comment From: sungangbin
这是来自QQ邮箱的假期自动回复邮件。您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。