我使用x!=null以避免NullPointerException。还有其他选择吗?
if (x != null) {
// ...
}
我使用x!=null以避免NullPointerException。还有其他选择吗?
if (x != null) {
// ...
}
当前回答
您可以使用类似JUnit的框架将类与单元测试相结合。这样,您的代码将是干净的(没有无用的检查),并且您将确保您的实例不会为空。
这是使用单元测试的一个很好的理由。
其他回答
使用Java8,您可以将供应商传递给下面这样的助手方法,
if(CommonUtil.resolve(()-> a.b().c()).isPresent()) {
}
上面的代码替换了下面的锅炉板代码,
if(a!=null && a.b()!=null && a.b().c()!=null) {
}
//通用工具.java
public static <T> Optional<T> resolve(Supplier<T> resolver) {
try {
T result = resolver.get();
return Optional.ofNullable(result);
} catch (NullPointerException var2) {
return Optional.empty();
}
}
Java7有一个新的Java.util.Objects实用程序类,其中有一个requireOnNull()方法。如果它的参数为null,那么它只会抛出一个NullPointerException,但它会稍微清理代码。例子:
Objects.requireNonNull(someObject);
someObject.doCalc();
该方法对于在构造函数中进行赋值之前进行检查非常有用,每次使用它都可以节省三行代码:
Parent(Child child) {
if (child == null) {
throw new NullPointerException("child");
}
this.child = child;
}
变成
Parent(Child child) {
this.child = Objects.requireNonNull(child, "child");
}
空对象模式可以用作此问题的解决方案。为此,应该修改someObject的类。
public abstract class SomeObject {
public abstract boolean isNil();
}
public class NullObject extends SomeObject {
@Override
public boolean isNil() {
return true;
}
}
public class RealObject extends SomeObject {
@Override
public boolean isNil() {
return false;
}
}
现在先检查一下,
if (someobject != null) {
someobject.doCalc();
}
我们可以使用,
if (!someObject.isNil()) {
someobject.doCalc();
}
参考:https://www.tutorialspoint.com/design_pattern/null_object_pattern.htm
就我个人而言,我要么同意jim nelson的答案,要么如果我确实发现空检查对于特定的上下文是方便的,我会将lombok合并到我的项目中,并使用@NonNull注释。
例子:
import lombok.NonNull;
public class NonNullExample extends Something {
private String name;
public NonNullExample(@NonNull Person person) {
super("Hello");
this.name = person.getName();
}
}
甚至在@NonNull序言中也提到:
或者:我是如何学会停止担心并爱上NullPointerException的。
我更喜欢这个
public void simpleFunc(SomeObject someObject){
someObject = someObject != null ? someObject : new SomeObject(null);
someObject.doSomething();
}
当然,在我的示例中,SomeObject优雅地处理空参数。例如,记录这样的事件,不做任何其他操作。