三元表达式踩坑记录

三元表达式大家会经常用,格式:expression1 ? expression2 : expression3 ,准确利用三元表达式可以写出漂亮高效的代码,最近笔者用三元表达式踩了个深坑

  • 场景1:三元表达式运用在if的复合判断中
public static void main(String[] args) {
        Param param = getParam();
        User vo = null;
        boolean flag = checkParam(param);

        if (vo != null && flag ? param.getType != 1 : vo.getName != null) {
            System.out.println("失败");
        }

        System.out.println("结束");
}

输出结果会是什么? 输出结果:

失败

结束


为什么呢? vo明确是null,为什么会进if判断里面 。

如果你代码是这样写的,idea也不会提示代码有问题。下面我把代码改下,看下idea会如何提示

  • 场景2:三元表达式在if复合判断中,idea提示代码有问题
public static void main1(String[] args) {
        User u1 = null;
        User u2 = null;
        User u3 = null;
        boolean flag = true;
        if (u1 != null && flag ? u2 != null : u3 != null) //这行代码idea提示代码有问题 {
            System.out.println("失败");
        }

        System.out.println("成功");

}

idea提示if判断有问题:This inspection analyzes method control and data flow to report possible conditions that are always true or false, expressions whose value is statically proven to be constant, and situations that can lead to nullability contract violations.
大致意思就是这个判断可能始终为真或为假的情况

运行代码,输出结果:

失败

结束


相信大家代码中使用场景1情况较多,idea会提示场景2的代码有问题。根据提示,可以确认场景1代码问题出在if判断可能永远为true。

那么 如何修改呢?

  • 修改方案
//三元表达式使用(),三元表达式作为一个整体进行判断
if (vo != null && 
(flag ? param.getType != 1 : vo.getName != null)) {
    System.out.println("失败");
}

//拆分两个判断
boolean checkFlag = flag ? param.getType != 1 : vo.getName != null;

if (vo != null && checkFlag) {
    System.out.println("失败");
}

以上两种方式都可以,不想再遇到类似三元表达式这种坑了,永远记住:bug永远出在最熟悉的地方 ,祝程序员永远不用踩坑

你可能感兴趣的:(开发遇到的问题,java,bug)