一种实用方法,表示"两者都不为空,不等于"在Java中

时间:2015-07-31 10:53:04

标签: java nullpointerexception

"items": [
  {
   "kind": "plus#person",
   "etag": "\"xoxof0VSFbg0RVYwDJMmg4Jxcp4/PNuMC_dEeZTZ-kScKTd8paGuyXg\"",
   "objectType": "person",
   "id": "106189723444098348646",
   "displayName": "Larry Page",
   "url": "https://plus.google.com/+LarryPage",
   "image": {
    "url": "https://lh3.googleusercontent.com/-Y86IN-vEObo/AAAAAAAAAAI/AAAAAAADO1I/QzjOGHq5kNQ/photo.jpg?sz=50"
   }
  },
  {
   "kind": "plus#person",
   "etag": "\"xoxof0VSFbg0RVYwDJMmg4Jxcp4/zMTOKX19L3IKS43Bv3m6xV0dLNM\"",
   "objectType": "person",
   "id": "111176035772651881663",
   "displayName": "Larry Page",
   "url": "https://plus.google.com/111176035772651881663",
   "image": {
    "url": "https://lh4.googleusercontent.com/-AFDqJCHiTuA/AAAAAAAAAAI/AAAAAAAAAEE/oMOpCoPpfy0/photo.jpg?sz=50"
   }
  },
  {
   "kind": "plus#person",
   "etag": "\"xoxof0VSFbg0RVYwDJMmg4Jxcp4/soC0nCQRAJ8gFoxvRJnf4iwMSB0\"",
   "objectType": "person",
   "id": "101600523208878203536",
   "displayName": "Larry Page",
   "url": "https://plus.google.com/101600523208878203536",
   "image": {
    "url": "https://lh4.googleusercontent.com/-UHYp8q4snW0/AAAAAAAAAAI/AAAAAAAACWs/BRe354a0WfU/photo.jpg?sz=50"
   }
  }
]

比较此字符串变量,如下所示。

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)) {} 对象,但它可能是一个更复杂的对象。

4 个答案:

答案 0 :(得分:4)

另一种方法是使用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

答案 1 :(得分:1)

如果您想使用null,则必须在某个时候检查str。没有办法绕过它。你可以把这个检查包装成一个额外的效用函数或类似的东西,但最后你不会得到额外的检查。

如果您是使用大量其他库的朋友,则可以使用org.apache.commons.lang.StringUtils#length(java.lang.String)。这就是你想要的,也许你有一个类似你的应用程序中存在的库。 apache只是一个例子。肯定有其他人做类似的事情。

如果您想要同时删除null支票,可能更好的问题是:为什么str可以null,并且有可能阻止它null从一开始就不接受这个价值。

答案 2 :(得分:1)

避免空值的另一种可能方法是使用assert:在另一个类似问题中查看此答案:

How to check to see that a set of variables is not null before continuing

答案 3 :(得分:1)

长话短说:据我所知,根本没有图书馆方法这样做。这个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);
}