有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java检查对象是否包含空值

我想写一个方法,检查给定对象是否包含空值字段。我写的很好,但问题发生在基本类型上

public static <T> List<String> checkIfNullsInObject(T ob) {

        List<String> fieldsAsNull = new LinkedList<>();

        for (Field f : ob.getClass().getDeclaredFields()) {
            f.setAccessible(true);
            try {
                if (Objects.isNull(f.get(ob))) {
                    fieldsAsNull.add(f.getName());
                }
            } catch (Exception e) {
                e.getMessage();
                e.printStackTrace();
            }
        }
        return fieldsAsNull;
    }

所以,例如

班犬:

public class Dog {
    private String name;
    private int age;
    private String owner;
///set get
}

给定对象:

Dog dog = new Dog();
        // dog.setAge(44);
        // dog.setName("Maniek");
        // dog.setOwner("AZE");

该方法应该返回“age,name,owner”,但它只返回最后两个。我知道int被设置为0,因此它不被认为是null,因为它是being原语类型,而不是对null的引用

java文档关于字段。get(objecto)方法表示:

返回指定对象上此字段表示的字段值。如果对象具有基元类型,则该值将自动包装在对象中

如果它被包装到对象,我希望它返回null,而不是零,我在这里遗漏了什么?它是不是在中间的某个地方再次被拆开

/////////////////////////////////////////////////////

我知道将类型更改为包装类可以完成这项工作,但我不确定由于添加另一个类而更改另一个类是否是一种好的做法,因此我决定这样做:

public static <T> void  checkIfNullsInObject(T ob) throws DataInputException {
        try {
            for (Field f : ob.getClass().getDeclaredFields()) {
                f.setAccessible(true);
                if (Objects.isNull(f.get(ob)) || checkForZeroPrimitives(ob, f)) 
                    throw new DataInputException("Can not update entity with field \"" 
                            + f.getName() + "\" set to: " + f.get(ob));
            }
        } catch (IllegalArgumentException |IllegalAccessException e) {
            e.getMessage();
            e.printStackTrace();
        }

    }

    private static <T> boolean checkForZeroPrimitives(T ob, Field field) throws IllegalArgumentException, IllegalAccessException {
        if (field.getType().getName().equals("int") && field.getInt(ob) == 0)
            return true;
        if (field.getType().getName().equals("double") && field.getDouble(ob) == 0.0)
            return true;
        if (field.getType().getName().equals("float") && field.getFloat(ob) == 0)
            return true;
        if (field.getType().getName().equals("long") && field.getLong(ob) == 0)
            return true;
        if (field.getType().getName().equals("short") && field.getShort(ob) == 0)
            return true;
        if (field.getType().getName().equals("byte") && field.getByte(ob) == 0)
            return true;
        if (field.getType().getName().equals("char") && field.getChar(ob)=='\u0000')
            return true;
        return false;
            }

稍后,我打算改进-if阶梯


共 (4) 个答案

  1. # 1 楼答案

    您可以使用{primitive type}检查字段中的一些基本数据类型。键入,比如long,Long.TYPE,其他人也一样

  2. # 2 楼答案

    这是因为您将其声明为原语,其(int)默认值为零。如果你想处理这个问题,在这种情况下,在你的方法中处理它

    Objects.isNull(f.get(ob)) || (f.getType().getName().equals("int") && ((Integer)f.get(ob)).intValue() == 0)
    

    这样,即使任何int字段被赋值为零,也可以得到。年龄(这个字段永远不能为零)

    如果你在这种情况下使用整数,你不需要做任何事情

        private Integer age;
    
        private int number;
    
        private String role = "";
    
    private void testNull(){
            Test ob = new Test();
            List<String> fieldsAsNull = new LinkedList<>();
            for (Field f : ob.getClass().getDeclaredFields()) {
                f.setAccessible(true);
                try {
                    if (Objects.isNull(f.get(ob)) || (f.getType().getName().equals("int") && ((Integer)f.get(ob)).intValue() == 0)) {
                        fieldsAsNull.add(f.getName());
                    }
                } catch (Exception e) {
                    e.getMessage();
                    e.printStackTrace();
                }
            }
            System.out.println(fieldsAsNull);
    }
    

    输出:[年龄,数字]

  3. # 3 楼答案

    这是因为它用对象包裹了原语,而不是反过来。这意味着agedog中是0,然后得到它的值,它是一个整数的包装。因此,整数包含0(未设置时,int的值自动为0)

    如果希望age能够为null,则必须使用包装对象(Integer)而不是原语(int

  4. # 4 楼答案

    如果将包装器用于以下基本类型,代码将正常工作:

    public class Dog {
        private String name;
        private Integer age;
        private String owner;
    }