我使用 x != null
来避免 NullPointerException
。有其他的替代方法吗?
if (x != null) {
// ...
}
我使用 x != null
来避免 NullPointerException
。有其他的替代方法吗?
if (x != null) {
// ...
}
Java 8在java.util包中引入了一个新类Optional。
Java 8 Optional的优势:
1.) 不需要进行空值检查。
2.) 不会再出现运行时的NullPointerException。
3.) 我们可以开发干净整洁的API。
Optional - 一个容器对象,可以包含一个非空值或者不包含任何值。如果一个值存在,则isPresent()方法将返回true,并且get()方法将返回该值。
更多细节请参见Oracle文档: https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html
Optionals
主要用于返回值,作为空对象以避免连续的 NPE
问题,而不是用作在传统或遗留代码中替代空检查的方法。 - fozzybearpublic static <T> T ifNull(T toCheck, T ifNull) {
if (toCheck == null) {
return ifNull;
}
return toCheck;
}
ObjectUtils.defaultIfNull()
。还有一个更通用的方法:ObjectUtils.firstNonNull()
,可以用来实现降级策略:firstNonNull(bestChoice, secondBest, thirdBest, fallBack);
。 - ivant我遵循以下准则来避免空指针检查。
Avoid lazy initialization of member variables as much as possible. Initialize the variables in declaration itself. This will handle NullPointerExceptions.
Decide on mutability of member variables early in the cycle. Use language constructs like final
keyword effectively.
If you know that augments for method won't be changed, declare them as final
.
Limit the mutation of data as much as possible. Some variables can be created in a constructor and can never be changed. Remove public setter methods unless they are really required.
E.g. Assume that one class in your application (A.java
) is maintaining a collection like HashMap
. Don't provide public
getter method in A.java and allow B.java
to directly add an element in Map
. Instead provide an API in A.java
, which adds an element into collection.
// Avoid
a.getMap().put(key,value)
//recommended
public void addElement(Object key, Object value){
// Have null checks for both key and value here : single place
map.put(key,value);
}
And finally, use try{} catch{} finally{}
blocks at right places effectively.
java.util
包中引入了一个新的类Optional。它用于表示值存在或不存在。这个新的构造的主要优点是不再需要太多的null检查和NullPointerException
。它避免了任何运行时的NullPointerExceptions
,并支持我们开发干净整洁的Java API或应用程序。就像Collections
和arrays
一样,它也是一个容器,最多只能容纳一个值。NullPointerException
,我只想添加一些在 Java 9
中引入的更多方式,以优雅地处理这种情况,并展示一些旧方法也可以使用,从而减少您的工作量。
public static boolean isNull(Object obj)
如果提供的引用为null,则返回true,否则返回false。
自Java 1.8以来
public static boolean nonNull(Object obj)
如果提供的引用非空,则返回true,否则返回false。
自Java 1.8以来
public static <T> T requireNonNullElse(T obj, T defaultObj)
如果第一个参数不为空,则返回第一个参数,否则返回非空的第二个参数。
自Java 9以来
public static <T> T requireNonNullElseGet(T obj, Supplier<? extends T> supplier)
如果第一个参数不为空,则返回第一个参数,否则返回supplier.get()的非空值。
自Java 9以来
public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier)
检查指定的对象引用不为null,否则抛出自定义的NullPointerException。
自Java 1.8以来
Java 9
中提供的更多功能。 - Mukesh A自从Java 7
开始使用java.util.Objects
类,但是自从Java 8
以后,你可以使用Objects.isNull(var)
和Objects.nonNull(var)
方法来进行空指针检查。
例如:
String var1 = null;
Date var2 = null;
Long var3 = null;
if(Objects.isNull(var1) && Objects.isNull(var2) && Objects.isNull(var3))
System.out.println("All Null");
else if (Objects.nonNull(var1) && Objects.nonNull(var2) && Objects.nonNull(var3))
System.out.println("All Not Null");
另一种选择:
下面这个简单的函数可以帮助隐藏空值检查(我不知道为什么,但我没有在同一个“通用”库的一部分中找到它):
public static <T> boolean isNull(T argument) {
return (argument == null);
}
if (!isNull(someobject)) {
someobject.doCalc();
}
在我看来,使用!= null
的方式并不是最好的表达方式。
isNotNull
会更好吧?这是不是更清楚地表明了你的意图? - TMNisNull
和一个isNotNull
方法。 - jehaPreconditions.checkNotNull(paramVal, "Method foo received null paramVal");
java.util.Objects
的isNull(yourObject)
方法。
例如:String myObject = null;
Objects.isNull(myObject); //will return true
用法:下面的代码返回非空值(如果名称不为空,则返回该值,否则返回默认值)。
final String name = "Jobin";
String nonNullValue = Optional.ofNullable(name).orElse("DefaultName");
myObject == null
没有太大区别,是在Java8中引入的Predicates
的lambda功能。 - PeterMmmObjects
是在Java7中引入的,isNull
稍后才被添加进去。 - JobinObjects.isNull
的不良使用示例。这里的 filter
是多余的。如果 name
为 null
,Optional.ofNullable()
将返回 Optional.empty()
,因此您可以只需执行以下操作:String nonNullValue = Optional.ofNullable(name).orElse("DefaultName");
- Araxia