最近在项目过程中使用到了okhttp网络框架,在给服务器以post键值对方式提交数据时服务器一直给空指针的异常,心想这次终于也发现后台人员的锅了,哈哈,但出于负责任自己用接口测试工具请求数据竟然没错误,细心一想着者很可能是是自己前端的问题,于是开始排查问题。
在debug模式下发现三个参数的键值都是一样的,what?怎么可能,细心看了自己的代码键值也没有错误,于是开始看传的参数的构造方法,果不其然网络请求框架中的Prams类被定义为了静态内部类,其成员变量也被定义为静态的,估计是之前同事没有 很好的理解java中静态成员变量的加载过程,导致我在构造很多了参数是出现了问题。
我在构造参数时直接这样使用:
OKHttpUtils.Paramparam=newOKHttpUtils.Param("startId", startId);
OKHttpUtils.ParamparamPage=newOKHttpUtils.Param("rows", pageSize +"");
OKHttpUtils.ParamparamSearchId=newOKHttpUtils.Param("searchId", searchId);
OKHttpUtils.Param[]pa=newOKHttpUtils.Param[]{param,paramPage,paramSearchId};
下边是构造参数的过程
Builderbuilder=newBuilder();
for(Paramparam: params) {
builder.add(param.key,param.value);
Log.i("okhttp",param.key);
}
熟悉java类加载的过程的同学看到这里,肯定知道了问题的所在,静态成员变量是存储方法 区内存中,而且只会存在一份数据。所以说我打印出来的param.key值三个都是 searchId,所以服务器也会报空指针的错误,最后把static 关键字给去掉,加上gette或者setter就解决了。