String str = "abc";
像下面这个字符串变量比较。
if(str.equals("abc")) {}
如果str
是null
,就会造成java.lang.NullPointerException
抛出明显。
为了避免这种情况,一个额外的空检查可予以强制执行。 如,
if(str != null && str.equals("abc")) {}
我觉得它难看。 更好的可被重写如下。
if("abc".equals(str)) {}
这绝不会抛出一个java.lang.NullPointerException
尽管str
是null
。 此外,对象等于null
是不正确的。
最后一种情况下然而,不能使用,当条件表达式被反转像这样,
if(!"abc".equals(str)) {
System.out.println(str.length());
}
这将导致java.lang.NullPointerException
里面if
块,如果str
是null
。
可以这样莫名其妙地被避免,不重写条件语句像下面这样?
if(str != null && !"abc".equals(str)) {}
这是丑陋,无法读取。
虽然示例使用一个String
对象,它可能是一个更复杂的对象。
另一种可能是使用Java 8可选封装
Optional<Customer> optional = findCustomer();
if (optional.isPresent()) {
Customer customer = maybeCustomer.get();
... use customer ...
}
else {
... deal with absence case ...
}
来源: https://dzone.com/articles/java-8-optional-how-use-it
你必须检查null
在某些时候,如果你想使用str
。 我们根本没有办法解决它。 你可以用此支票存入一个额外的效用函数或类似这样的东西,但最终你不会得到周围的额外的检查。
如果你正在使用的附加库负荷的朋友,你可以使用org.apache.commons.lang.StringUtils#length(java.lang.String)
。 这不只是你想要什么,也许你有像存在于你的应用程序库反正。 apache的一个仅仅是一个例子。 还有其他人肯定围绕着做类似的事情。
如果你想删除的null
支票一起,也许更好的问题是:为什么str
是null
,这是可能的,以防止它被null
的不接受从一开始这个值。
另一种可能的方式,以避免空值是使用assert
:看看这个答案在另一个类似的问题:
如何检查看到,一组变量是不是在继续前空
长话短说:是根本不存在的库法这样做,我知道的。 这if(str != null && !"abc".equals(str)) {}
实际上要求要比较两个对象都没有null
,而不是彼此相等。
执行此任务的静态实用方法足以应付。
/**
* Returns {@code true} if and only if both the arguments (objects) are
* <b>not</b> {@code null} and are not equal to each other and {@code false}
* otherwise.
*
* @param a an object.
* @param b an object to be compared with {@code a} for equality.
* @return {@code true} if both the arguments (objects) are <b>not</b> {@code null}
* and not equal to each other.
*/
public static boolean notEquals(Object a, Object b) {
return (a == b || a == null || b == null) ? false : !a.equals(b);
}