在Java中检查空值的最佳方法是什么?

时间:2013-06-25 16:08:35

标签: java null nullpointerexception

在调用对象的函数之前,我需要检查对象是否为null,以避免抛出NullPointerException

最好的方法是什么?我考虑过这些方法。
哪一个是Java的最佳编程实践?

// Method 1
if (foo != null) {
    if (foo.bar()) {
        etc...
    }
}

// Method 2
if (foo != null ? foo.bar() : false) {
    etc...
}

// Method 3
try {
    if (foo.bar()) {
        etc...
    }
} catch (NullPointerException e) {
}

// Method 4 -- Would this work, or would it still call foo.bar()?
if (foo != null && foo.bar()) {
    etc...
}

18 个答案:

答案 0 :(得分:58)

方法4最好。

if(foo != null && foo.bar()) {
   someStuff();
}

将使用short-circuit evaluation,这意味着如果logical AND的第一个条件为假,则结束。

答案 1 :(得分:11)

最后也是最好的一个。即逻辑和

  if (foo != null && foo.bar()) {
    etc...
}

因为在逻辑&&

  

没有必要知道右手边是什么,结果必须是假的

喜欢阅读:Java logical operator short-circuiting

答案 2 :(得分:7)

在Java 8中,检查null的最佳方法是:

Objects.isNull(obj) //returns true if the object is null

Objects.nonNull(obj) //returns true if object is not-null

if(Objects.nonNull(foo) && foo.something()) // Uses short-circuit as well. No Null-pointer Exceptions are thrown.

除此之外......您还可以使用Guava的Optional Class

减少类似(obj=null)这样的类型错误,如前面的答案所述,它总是返回true

答案 3 :(得分:5)

  • 不要抓住NullPointerException。这是一种不好的做法。最好确保该值不为空。
  • 方法#4适合您。它不会评估第二个条件,因为Java有短路(即,如果它们不改变布尔表达式的最终结果,则不会评估后续条件)。在这种情况下,如果逻辑AND的第一个表达式的计算结果为false,则不需要计算后续表达式。

答案 4 :(得分:4)

方法4是最好的,因为它清楚地表明会发生什么并使用最少的代码。

方法3在每个级别上都是错误的。你知道这个项目可能是空的,所以这不是一个特殊的情况,你应该检查它。

方法2只是让它变得比它需要的更复杂。

方法1只是方法4,带有额外的代码行。

答案 5 :(得分:2)

Java 7 中,您可以使用Objects.requireNonNull()。 从Objects添加java.util类的导入。

public class FooClass {
    //...
    public void acceptFoo(Foo obj) {
        //If obj is null, NPE is thrown
        Objects.requireNonNull(obj).bar(); //or better requireNonNull(obj, "obj is null");
    }
    //...
}

答案 6 :(得分:2)

方法4是我首选的方法。 && amp;的短路运算符使代码最具可读性。方法3,捕获NullPointerException,大多数情况下只需要一个简单的空检查即可。

答案 7 :(得分:2)

我想说方法4是我所看过的代码中最常用的习语。但这对我来说总觉得有点臭。它假设foo == null与foo.bar()== false相同。

这对我来说并不总是合适。

答案 8 :(得分:1)

如果您控制被调用的API,请考虑使用Guava's Optional class

更多信息here。更改您的方法以返回Optional<Boolean>而不是Boolean

通过调用Optional

中的一个方便方法,通知调用代码它必须考虑null的可能性。

答案 9 :(得分:1)

正如其他人所说,#4是不使用库方法的最佳方法。但是,您应该始终在比较的左侧放置null,以确保在输入错误时不会意外地将null赋给foo。在这种情况下,编译器将捕获错误。

// You meant to do this
if(foo != null){

// But you made a typo like this which will always evaluate to true
if(foo = null)

// Do the comparison in this way
if(null != foo)

// So if you make the mistake in this way the compiler will catch it
if(null = foo){

// obviously the typo is less obvious when doing an equality comparison but it's a good habit either way
if(foo == null){
if(foo =  null){

答案 10 :(得分:1)

您还可以使用StringUtils.isNoneEmpty("")检查为空或空。

答案 11 :(得分:1)

如果你要用双等号检查&#34; ==&#34;然后使用对象引用检查null

if(null == obj) 

而不是

if(obj == null)

因为如果你错误输入单个等于if(obj = null)它将返回true(赋值对象返回成功(这是&#39; true&#39; in value)。

答案 12 :(得分:0)

如果您无法访问commons apache库,则以下内容可能正常

if(null != foo && foo.bar()) {
//do something
}

答案 13 :(得分:0)

你最后的提议是最好的。

if (foo != null && foo.bar()) {
    etc...
}

由于:

  1. 更容易阅读。
  2. 安全:如果foo == null。
  3. ,永远不会执行foo.bar()
  4. 它可以防止诸如捕获NullPointerExceptions之类的错误操作(大部分时间是由于代码中的错误)
  5. 它应该比其他方法执行得更快或更快(尽管我认为几乎不可能注意到它)。

答案 14 :(得分:0)

我们可以使用Object类的Object.requireNonNull静态方法。实施如下

public void someMethod(SomeClass obj) {
    Objects.requireNonNull(obj, "Validation error, obj cannot be null");
}

答案 15 :(得分:0)

简单的一行检查null的代码:

namVar == null ? codTdoForNul() : codTdoForFul();

答案 16 :(得分:0)

对于 java 11+,您可以使用 Objects.nonNull(Object obj)

if(nonNull(foo)){ 
//
}

答案 17 :(得分:0)

public <T, U> U defaultGet(T supplier, Function<T, U> mapper, U defaultValue) {
        return Optional.ofNullable(supplier).map(mapper).orElse(defaultValue);

    }

如果你喜欢函数式编程,你可以创建这个函数