问题:java对象接受从数据库查出来的数据时,对对象的某一属性进行操作,在操作属性中存储的数据中不对进行检查,会出现空指针异常的情况。
问题再现:新建一个实体类
public class Student { private Integer id; private String name; private String age; private String course; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } public String getCourse() { return course; } public void setCourse(String course) { this.course = course; } }
进行测试
@Test public void test(){ //数据模拟 Student student = new Student(); student.setId(1); student.setName("张三"); student.setAge("12"); //这里不对course属性赋值 // student.setCourse("语文,数学,英语"); System.out.println(student.getId()); System.out.println(student.getName()); System.out.println(student.getAge()); System.out.println(student.getCourse()); }
输出内容:
1
张三
12
null
对course属性进行操作
@Test public void test(){ //数据模拟 Student student = new Student(); student.setId(1); student.setName("张三"); student.setAge("12"); //这里不对course属性赋值 // student.setCourse("语文,数学,英语"); System.out.println(student.getCourse().length()); }
这里就会报异常
通过这里看以看出,取出实体类中的数据是没问题的,但当我们对course属性进行操作时,就会包空指针异常。
解决问题思路:我们需要提前判断这个属性是否为空。
为了解决问题我们用到了反射,并把封装成了一个工具类
public class ObjectUtil { /** * 判断对象中部分属性值是否不为空 * * @param object 对象 * @param excludeFieldNames 选择校验的属性名称List集合 * @return */ public static boolean checkObjFieldsIsNotNull(Object object, List<String> excludeFieldNames) { if (null == object) { return false; } try { for (Field f : object.getClass().getDeclaredFields()) { f.setAccessible(true); if (excludeFieldNames.contains(f.getName()) && f.get(object) != null && StringUtils.isNotBlank(f.get(object).toString())) { return true; } } } catch (Exception e) { e.printStackTrace(); } return false; } }
使用工具类进行判断:
@Test public void test(){ //数据模拟 Student student = new Student(); student.setId(1); student.setName("张三"); student.setAge("12"); //这里不对course属性赋值 // student.setCourse("语文,数学,英语"); //当course属性为空时 System.out.println("执行开始"); if (ObjectUtil.checkObjFieldsIsNotNull(student,Arrays.asList("course"))){ System.out.println("执行"); System.out.println(student.getCourse().length()); } System.out.println("执行完毕"); }
输出结果:
从这里可以看出if条件为空,并没有执行,因为此时course属性为空,判断不成立。
当course属性不为空时:
@Test public void test(){ //数据模拟 Student student = new Student(); student.setId(1); student.setName("张三"); student.setAge("12"); student.setCourse("语文,数学,英语"); System.out.println("执行开始"); if (ObjectUtil.checkObjFieldsIsNotNull(student,Arrays.asList("course"))){ System.out.println("执行"); System.out.println(student.getCourse().length()); } System.out.println("执行完毕"); }
执行结果:
可以看出:当属性不为空时,判断为真。 此时我们就完成了对属性是否为空的判断。
总结
您可能感兴趣的文章: