这个异常相信大家一定非常眼熟,相信在每人的程序开发生涯中都遇到过。在这次高校3.1的开发中,这样的错又这样被抛出来了。这是一个小bug,但遇到它,它就能让你恶心半天,因为的程序会因此挂起,不再提供正常的服务。
在基础开发对外服务接口的时候,经常遇到服务异常,其他系统在调用接口的时候,时而不能正常提供数据。然后我就去jboss上去翻看server.log,发信有报java.lang.NullPointerException的错,然后以java.lang.NullPointerException计数,查到481处同样的错误。
究其原因,在开发接口实现的时候,方法的返回值没有判断null值直接返回
看两个比较典型方法实现
lstStudent = studentBean.queryStudentAll();
List fields = new ArrayList();
ObjectToMap otm = new ObjectToMap();
fields= Arrays.asList(Student.class.getFields()) ;
List<Map<Serializable, Serializable>> list = otm.convertToMap(fields, lstStudent);//在使用ObjectToMap.convertToMap() 方法前没有判断
return list;
以上的lstStudent在利用ObjectToMap.convertToMap()方法的时候,没有判断它是否为null,就直接进行了转换,一旦为null值,返回值list也就为null,便导致了该错的出现。
public List<Map<Serializable, Serializable>> queryColleageNamesByIds(
List<String> colleageIds, String dataBaseName) {
List<Map<Serializable, Serializable>> listMapInstitution = new ArrayList<Map<Serializable, Serializable>>();
List<Institution> listInstitution= new ArrayList<Institution>();
listInstitution=institutionEao.queryByList(colleageIds, dataBaseName);
if (listInstitution != null || listInstitution.size() > 0
|| listInstitution.get(0) != null) {
EntityToMap entityToMap = new EntityToMap();
listMapInstitution = entityToMap.entityToMap(listInstitution);
return listMapInstitution;
} else {
return null;//至少应该返回 new List<Map<Serializable, Serializable>>,这样不至于报java.lang.NullPointerException异常
}
}
该方法的错误很明显,如果查询不到就直接干脆返回了一个null.至少应该返回 new List<Map<Serializable, Serializable>>,这样不至于报java.lang.NullPointerException异常.
翻看之前的学习记录,发现一些对null和""的方法总结,再拿出来分享一下,希望以后不再被java.lang.NullPointerException所困扰
假如现在要对一个name对象,我们往往习惯了这样写
if (name =="") {
//do something
}
或者这样写:
if(name.equals("")) {
//do something
}
前者,初学者最容易犯,也最不容易被发现的错误,因为它们的语法本身没问题,Java编译器编译时不报错。但这种条件可能在运行时导致程序出现bug,永远也不会为true,也就是时说,if块里的语句永远也不会被执行。
后者,包括很多Java熟手也很容易犯的错误,为什么是错误的呢?也许你会感到纳闷。
对,它们的写法本身没错,但是,少了一个null判断的条件,试想,如果name=null的情况下,会发生什么后果呢?后果是,你的程序将抛出NullPointerException异常,系统将被挂起,不再提供正常服务。
当然,如果之前已经对name作了null判断的情况例外。
正确的写法应该先加上name != null的条件,如例:
if(name!= null && !name.equals("")) {
//do something
}
或者
if(!"".equals(name)&& !null.equals ) {//将""写在前头,这样,不管name是否为null,都不会出错。
//do something
}