if(obj != null) {
str = obj.toString( );
}
但是,当被保护的块象下面这样的时候,是有问题的:
if(obj.equals(newobj)) {
....
}
加上保护用的if-null块会变成这样:
if(obj != null) {
if(obj.equals(newobj)) {
....
}
}
当嵌套if块来处理null保护时显得很凌乱,这时可以试一下使用短路运算符。例如布尔“与”运算符,“&&”:
if((obj != null) && obj.equals(newobj) ) {
...
}
“短路”意味着运算符只对必要的部分求值,而不是整个表达式。如果变量“obj”等于null,就不会尝试对“obj.equals(newobj)”子句求值。这就对潜在的NullPointerException提供了保护。
布尔“或”运算符“||”也有同样的特性,但它的用法和“与”短路运算相反。它不是当前面的子句取假值时提前中止求值,而是当前面的子句取真值时这样做。例如:
if((number==9) || (doAnalysis(number) < 20) ) {
....
}
在上面的代码片断中,如果number等于9,它会中止if子句并且不会执行doAnalysis方法。虽然知道这一点很有用,但很可能你在不知道的情况下已经这样做了。
使用“或”短路运算符要注意的最重要的方面,是要确保你按照子句取真值的复杂性和可能性的顺序来排列它们。考虑下面三个子句:
排列if语句来避免不必要的工作:
if( A || C || B ) {
...
}
开发者善于利用短路运算符可以提高性能且简化代码。