检查对象是否为空。

43

基本上,你如何检查一个对象是否为null或空。我的意思是,如果我实例化了一个对象,但它的所有值或字段都为null,那么我该如何在代码中检查它是否为空?

我已经尝试过以下方法;

if (doc != null){
.... do something

但它似乎不起作用。


3
好的,我会尽力进行翻译。以下是需要翻译的内容:"How does it not work? How does your object look like? What is doc here?"它为什么不能工作?你的物体看起来像什么?这里的doc是什么? - Rohit Jain
参考文献可以为空,但对象不能为空。一个对象可能有一个名为 isEmpty() 的方法,这并不意味着它不使用任何内存,而且在满时可能使用相同量的内存,例如 ArrayBlockingQueue。它是一种表明对象不包含任何其他可获取对象的方法。这是只有组件的开发人员才能确定的内容。 - Peter Lawrey
9个回答

46

您不能直接这样做,您应该提供自己的检查方式。例如:

class MyClass {
  Object attr1, attr2, attr3;

  public boolean isValid() {
    return attr1 != null && attr2 != null && attr3 != null;
  }
}

或者将所有字段都声明为final,并在构造函数中初始化,以确保所有字段都被正确地初始化。


也许可以使用java.lang.reflect来完成,但这可能会出现错误... - Bastien Jansen
是的,但在需要使用反射之前,我会担心具有未初始化为null的字段的需求。这始终是关于空值的相同问题。 - Jack
我完全同意你的观点。也许楼主有一个错误的需求(但他没有解释为什么需要检查这个)。 - Bastien Jansen
@Nebelmann 反射?你为什么要用那个,这只是基本的面向对象/封装问题。 - NimChimpsky
我一次性设置了所有变量的值,大约有20个变量。我可以只写一个变量的返回检查,而不是为所有20个变量都写一个null的返回检查。 - Ace McCloud

18
import org.apache.commons.lang3.ObjectUtils;
if(ObjectUtils.isEmpty(yourObject)){
  //your block here
}

4
它仅适用于CharSequence、Collection和Map。对于自定义对象,它将始终返回false。(参见方法实现) - Anto

8

可以使用Java反射来实现此操作。如果对象存在任何一个属性值,则该方法返回false。希望能对某些人有所帮助。

public boolean isEmpty()  {

    for (Field field : this.getClass().getDeclaredFields()) {
        try {
            field.setAccessible(true);
            if (field.get(this)!=null) {
                return false;
            }
        } catch (Exception e) {
          System.out.println("Exception occured in processing");
        }
    }
    return true;
}

1
这个能通过递归调用其子对象来实现任意深度的工作吗?我尝试过了,但是在像Long和String这样有其他内容的子对象上卡住了,getDeclaredFields()返回了多个子对象。 - mojoken

3

你应该将其与 null 进行比较。

如果你想检查对象 x 是否为 null,可以这样做:

    if(x != null)

但如果它不为空,它可以具有空值或空字符串的属性。您需要显式检查这些内容:

    if(x.getProperty() != null)

"empty"检查取决于所涉及的类型。对于Java "String",通常可以执行以下操作:

    if(str != null && !str.isEmpty())

由于您没有提到具体的问题,很难确定。

3

我建议您添加独立的重载方法并将它们添加到您项目的Utility/Utilities类中。

检查集合是否为空或为null

public static boolean isEmpty(Collection obj) {
    return obj == null || obj.isEmpty();
}

或者使用Apache Commons CollectionUtils.isEmpty()

检查Map是否为空或null

public static boolean isEmpty(Map<?, ?> value) {
    return value == null || value.isEmpty();
}

或者使用Apache Commons MapUtils.isEmpty()

检查字符串是否为空或null

public static boolean isEmpty(String string) {
    return string == null || string.trim().isEmpty();
}

或者使用Apache Commons StringUtils.isBlank()

检查对象是否为null很容易,但验证其是否为空很棘手,因为对象可能具有许多私有或继承变量和嵌套对象,这些都应该为空。为此,需要验证所有内容或在所有对象中添加一些isEmpty()方法来验证对象是否为空。


1

对于简单的情况(在我的项目中已经起作用)。 如果某些字段不需要进行空值检查,则从toString()方法中排除它,就像我上面的代码中删除了school一样。

public class Student {
    private String name;
    private String school;
    private Integer roll;
    private String section;
    //getters and setters

    @Override
    public String toString() {
        return "Student [name=" + name + ", roll=" + roll + ", section=" + section + "]";
    }

}


public class StudentRunner {
    
    public static void main(String[] args) {
        Student s = new Student();
        s.setName("ved");
        s.setRoll(12);
        s.setSection("A");
        s.setSchool(null);//school set null and it removed from toString() method
        if(s.toString().contains("null")) {
            System.out.println("null value contains");
            //do your work here or throw exception
        } else {
            System.out.println("no null value");
        }
    }

}

输出:没有空值。

0
如果您的对象包含其他对象,请检查它们是否为null;如果它包含基本类型,请检查它们的默认值。
例如:
Person Object 
name Property with getter and setter

to check if name is not initialized. 

Person p = new Person();
if(p.getName()!=null)

0

我有一个方法,你们告诉我它好不好。

创建一个类的新对象,将其与您要检查是否为空的对象进行比较。

为了正确执行:

重写您的模型类的hashCode()和equals()方法,以及您的类成员所属的类的对象的这些方法,例如:

人类(主要模型类):

public class Person {

    private int age;
    private String firstName;
    private String lastName;
    private Address address;

    //getters and setters

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((address == null) ? 0 : address.hashCode());
        result = prime * result + age;
        result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
        result = prime * result + ((lastName == null) ? 0 : lastName.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (address == null) {
            if (other.address != null)
                return false;
        } else if (!address.equals(other.address))
            return false;
        if (age != other.age)
            return false;
        if (firstName == null) {
            if (other.firstName != null)
                return false;
        } else if (!firstName.equals(other.firstName))
            return false;
        if (lastName == null) {
            if (other.lastName != null)
                return false;
        } else if (!lastName.equals(other.lastName))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "Person [age=" + age + ", firstName=" + firstName + ", lastName=" + lastName + ", address=" + address
                + "]";
    }

}

地址类(在人类内部使用):

public class Address {

    private String line1;
    private String line2;

    //getters and setters

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((line1 == null) ? 0 : line1.hashCode());
        result = prime * result + ((line2 == null) ? 0 : line2.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Address other = (Address) obj;
        if (line1 == null) {
            if (other.line1 != null)
                return false;
        } else if (!line1.equals(other.line1))
            return false;
        if (line2 == null) {
            if (other.line2 != null)
                return false;
        } else if (!line2.equals(other.line2))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "Address [line1=" + line1 + ", line2=" + line2 + "]";
    }

}

现在在主类中:

    Person person1 = new Person();
    person1.setAge(20);

    Person person2 = new Person();

    Person person3 = new Person();

if(person1.equals(person2)) --> this will be false

if(person2.equals(person3)) --> this will be true

我希望这是最好的方法,而不是在每个成员变量上放置if条件。

告诉我吧!


这不是问题所要求的。 - Evil Washing Machine

-4

假设,

data = {};

if( if(!$.isEmptyObject(data)))
{
     document.write("Object is empty);
}

else{
    document.write("Object is not empty);
}

对我来说很有效,并且这是一种简单的方法来检查对象是否为空。


2
你写的代码是JavaScript。问题是关于Java而不是JavaScript。 - Manos Kounelakis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接