解读:
逻辑与(&&):如果左操作数结果为true,则继续计算右操作数;如果左操作数结果为false,则对右操作数的运算已经没有必要,直接返回结果false,忽略右操作运算。
逻辑或(||):如果左操作数结果为false,则继续计算右操作数;如果左操作数结果为true,则对右操作数的运算已经没有必要,直接返回结果true,忽略右操作运算。
逻辑与(&)、逻辑或(|):不管左操作数的运算结果如何,都一律计算右边的操作数。
案例:
SysDataSet sds = con.csCommonSP("P_KMS_GETORIGINALFILETREE");
SysRecord sr = sds != null ? sds.getParamSet() : null;
rs = (sr != null & sr.getInt(0) == 0) ? sds.getResultSet() : null;
上面的代码有可能会造成空指针错误,代码中使用的是非短路与(&),也就是不管左边的sr != null的结果如何,都一律运算右边的sr.getInt(0) == 0,那如果遇到sr为null值的情况,则一样也会调用到sr.getInt(0), 显然就会出现空指针异常。解决这个问题的最好选择是改用短路运算与(&&),如下面代码段所示。
SysDataSet sds = con.csCommonSP("P_KMS_GETORIGINALFILETREE");
SysRecord sr = sds != null ? sds.getParamSet() : null;
rs = (sr != null && sr.getInt(0) == 0) ? sds.getResultSet() : null;