使用评估顺序检查空值是否是不好的做法?

Is using the order of evaluation to check for null values bad practice?

如果我想对一个字符串执行两次检查,确定它不为空,并且它的长度不为 0,我可以这样做-

if(string != null) {
    if(string.length() > 0) {
        //Do something
    }
}

或者我可以这样做

if(string != null && string.length() > 0) {
    //Do something
}

由于首先执行第一个检查,因此不会发生第二个比较,也不会抛出 NullPointerException。

第二种方法是否保证在所有情况下都有效?如果是这样,使用它会被认为是不好的做法吗?

不,它非常好,保证在所有情况下都能正常工作。

来自 Java 规范的引用:https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.7

这里值得一提的是:由于您经常编写此类检查,因此建议将它们放入一些专用的辅助方法中;如:

static boolean doesStringContentContent(String value) {

或类似的东西。

从 "improved" 可读性的角度来看,您可能更喜欢像

这样的编码
if (value == null) return false;
if (value.isEmpty()) return false;
return true;

但这并不重要 - 重要的是你不应该绕过这张支票开始抄袭。

最后,另一种可能性不是 return 布尔值,而是

void checkStringHasContent(String value) {

这可能会抛出 NullPointerException 异常。空字符串的其他东西。

您在第二个表达式中使用了 &&(和)运算符。并在第一个表达式中嵌套 if 条件。在这两种情况下,您都会得到相同的结果。因为 &&(and) 运算符仅当第一个条件为真时才执行第二个条件。

基本上你是在用不同的方式做同样的事情。