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阶梯
# 1 楼答案
您可以使用{primitive type}检查字段中的一些基本数据类型。键入,比如long,
Long.TYPE
,其他人也一样# 2 楼答案
这是因为您将其声明为原语,其(int)默认值为零。如果你想处理这个问题,在这种情况下,在你的方法中处理它
这样,即使任何int字段被赋值为零,也可以得到。年龄(这个字段永远不能为零)
如果你在这种情况下使用整数,你不需要做任何事情
输出:[年龄,数字]
# 3 楼答案
这是因为它用对象包裹了原语,而不是反过来。这意味着
age
在dog
中是0,然后得到它的值,它是一个整数的包装。因此,整数包含0(未设置时,int的值自动为0)如果希望
age
能够为null,则必须使用包装对象(Integer
)而不是原语(int
)# 4 楼答案
如果将包装器用于以下基本类型,代码将正常工作: