使用评估顺序检查空值是否是不好的做法?
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) 运算符仅当第一个条件为真时才执行第二个条件。
基本上你是在用不同的方式做同样的事情。
如果我想对一个字符串执行两次检查,确定它不为空,并且它的长度不为 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) 运算符仅当第一个条件为真时才执行第二个条件。
基本上你是在用不同的方式做同样的事情。