Skip to content

引言

起因是在Solon群浏览到的问题,也没太在意,然后第二天在sqltoy群里又有人提及到类似问题,太巧了吧(有点意思),所以记录下来了。

案例

在Solon群某位用户粘贴出来的代码: alt textalt text

在sqltoy群看到的: alt textalt text

分析

上面的案例代码如果不仔细看的话确实没啥问题,但是其实有很大问题!!!

代码解析如下:

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]);   // 这样执行顺序就比较直观了