空字符串的比较,空指针异常。java将Strin该类型的“null”转换为空,java反射获取对象的所有属性并判断再赋值
1. 产生原因
我的设计缘由是因为前端vue填写某个表单时,有的输入项可以不输入,插入时数据库设计的是插入null,于是前端详情界面就由于没有判断,而且vue中{{}}双括号还可以用v-if判断一下,但v-model怎么判断可头疼了,但是更改数据库的设计时下下策,于是采用工具类。将一个类中所有的String类型的“null”字符串转换为空。
比较"null"时发现一个有趣的事,先上工具类代码
public static Object getObjectNUllValueToEmpty(Object object) throws Exception { // 利用反射获取实体类的所有属性,返回Field数组 /*****import java.lang.reflect.Field;使用这个*******/ Field[] field = object.getClass().getDeclaredFields(); try { // 遍历所有属性 for (Field item : field) { // 获取属性的名字 String name = item.getName(); // 将属性的首字符大写,方便构造get,set方法 name = name.substring(0, 1).toUpperCase() + name.substring(1); // 获取属性的类型 String type = item.getGenericType().toString(); //这里仅判断了String类型的属性 // 如果type是类类型,则前面包含"class ",后面跟类名 if (type.equals("class java.lang.String")) { Method m = object.getClass().getMethod("get" + name); System.out.println(m); // 调用getter方法获取属性值 String value = (String) m.invoke(object); //这里做判断 if ("null".equals(value)) { //调用set方法 m = object.getClass().getMethod("set" + name, String.class); System.out.println(m); //这里赋值 m.invoke(object, ""); } } } } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } return object; }
2.有趣的时,现在才发现为什么以前看别人的代码时都反过来写
if ("null".equals(value)) 这句话不能写成if(value.equals("null")),这样会报空指针异常
3.工具类拓展
上面的判断,还可以增加Integer类型的判断,紧接着String的判断写就行
4.使用该工具类
我使用springBoot作为讲解,我们经常会使用以下代码
User userInfo= service.getInfoById(id); //紧接着使用静态类即可,但由于我返回值是Object,所以得强转为你需要的类型 User userInfoAfterInfo = (User) getObjectNUllValueToEmpty(userInfo) return Result.OK(userInfoAfterInfo) //这样vue无论是{{}}还是v-model就都不需要再判断了