当步骤的返回类型是数组或集合时,不要返回null,尽量返回容量为0的数据或集合
当方法的返回类型是数组或集合时,不要返回null,尽量返回容量为0的数据或集合
今天测试3.0的后台代码时,遇到了一个空指针的bug,是由于调用的方法返回的是集合,由于实际返回的是null,后头有调用了这个对象的方法,导致空指针。这段代码的质量需要改善,如果返回容量为0的集合,则完全可以避免空指针。先贴错误代码。
public Result queryStoreServiceAttendList(AttendParamVo vo) { Result result = new Result(); try { List<AnalysisDetailBean> details = attendanceManager.queryStoreServiceAttendList(vo); List<ServerPopBean> allService = storeService.queryServerListByStoreAndYn(vo.getStoreId()); Map<String, ServiceAttendAnalysisVo> attentVoMap = new HashMap<String, ServiceAttendAnalysisVo>(allService.size());//null pointer! int totalDays= DateUtils.getIntervalDays(vo.getStartDate(), vo.getEndDate()); .....}
@Override public List<ServerPopBean> queryServerListByStoreAndYn(int storeId) { try { if(storeId != 0){ return serverPopManager.queryServerListByStoreAndYn(storeId); }else{ return null; } } catch (Exception e) { log.error("Query server list by store and yn error!", e); return null; } }
可以看出来,如果要调用queryServerListByStoreAndYn()方法的返回对象,一个必要的操作是判空!但是,调用的代码并没有进行判空,直接操作,造成了空指针一样。
怎样让调用者省心不用判空?So easy!返回容量为零的集合。这样,既保持了代码的逻辑不变,而且调用方便不用判空。
修改后的代码如下:
@Override public List<ServerPopBean> queryServerListByStoreAndYn(int storeId) { try { if(storeId != 0){ return serverPopManager.queryServerListByStoreAndYn(storeId); }else{ return new ArrayList<ServerPopBean>(); } } catch (Exception e) { log.error("Query server list by store and yn error!", e); return new ArrayList<ServerPopBean>(); } }
如此一来,便可完全规避不必要的空指针异常。《effective java》一书有对这种代码的详解。