引言
起因是在Solon群浏览到的问题,也没太在意,然后第二天在sqltoy群里又有人提及到类似问题,太巧了吧(有点意思),所以记录下来了。
案例
在Solon群某位用户粘贴出来的代码:
在sqltoy群看到的:
分析
上面的案例代码如果不仔细看的话确实没啥问题,但是其实有很大问题!!!
代码解析如下:
java
String[] arr = new String[]{};
LambdaQueryWrapper<RqAgent> lambdaQuery = Wrappers.lambdaQuery(RqAgent.class)
.eq(arr.length>0, RqAgent::getAgentId, arr[0]); // 这里的arr[0]其实已经报错了,eq函数还没接收到参数前已经报错
其实这代码相当于:
java
String[] arr = new String[]{};
String ss = arr[0]; // 这里就已经数组越界
LambdaQueryWrapper<RqAgent> lambdaQuery = Wrappers.lambdaQuery(RqAgent.class)
.eq(arr.length>0, RqAgent::getAgentId, ss);
结论
因为 arr[0] 是在获取第0项的对象,但是第0项没有导致数组越界异常(Array index is out of bounds),无需再看 arr.length>0 是否为false
- 解决方法1
老老实实使用if:
java
if (arr.length > 0) {
LambdaQueryWrapper<RqAgent> lambdaQuery = Wrappers.lambdaQuery(RqAgent.class)
.eq(RqAgent::getAgentId, arr[0]);
}
- 解决方法2(能用,但不推荐)
java
String[] arr = new String[]{};
boolean flag = arr.length > 0;
LambdaQueryWrapper<RqAgent> lambdaQuery = Wrappers.lambdaQuery(RpaAgent.class)
.eq(flag, RpaAgent::getAgentId, flag?arr[0]:null);
最后
如果LambdaQueryWrapper使用的是这种方式可能会比较好点:
java
String[] arr = new String[]{};
LambdaQueryWrapper<RqAgent> lambdaQuery = Wrappers.lambdaQuery(RpaAgent.class)
.eq(arr.length > 0, RpaAgent::getAgentId, () -> arr[0]); // 这样执行顺序就比较直观了