当以空值作为参数传递字符串时,发送字符串请求错误



我正在使用以下代码的字符串请求对截击

    pDialog = new ProgressDialog(context);
    pDialog.setMessage("Loading...");
    pDialog.setCancelable(false);
    pDialog.show();
    StringRequest strReq = new StringRequest(Method.POST,
        url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                pDialog.dismiss();
                Log.e(tag, response);                   
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                pDialog.dismiss();
            }
        }) {
        protected Map<String, String> getParams(){
            Map<String, String> params = new HashMap<String, String>();
            params.put("tag", "SHOW_FILE");
            params.put("filename",filename);
            return params;
        };
    };      
    // Adding request to request queue
    Application.getInstance().addToRequestQueue(strReq, "get_file");

如果变量filename=null,我得到以下错误:

08-02 10:28:06.192: E/Volley(2935): [2128] NetworkDispatcher.run: Unhandled exception java.lang.NullPointerException
08-02 10:28:06.192: E/Volley(2935): java.lang.NullPointerException
08-02 10:28:06.192: E/Volley(2935):     at libcore.net.UriCodec.encode(UriCodec.java:132)
08-02 10:28:06.192: E/Volley(2935):     at java.net.URLEncoder.encode(URLEncoder.java:57)
08-02 10:28:06.192: E/Volley(2935):     at com.android.volley.Request.encodeParameters(Request.java:449)
08-02 10:28:06.192: E/Volley(2935):     at com.android.volley.Request.getBody(Request.java:435)
08-02 10:28:06.192: E/Volley(2935):     at com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:236)
08-02 10:28:06.192: E/Volley(2935):     at com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:210)
08-02 10:28:06.192: E/Volley(2935):     at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:106)
08-02 10:28:06.192: E/Volley(2935):     at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:93)
08-02 10:28:06.192: E/Volley(2935):     at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:110)

是否需要null值检查所有参数I POST或任何其他方法来解决这个问题并处理null值?

谢谢你的帮助

我已经创造了一个新的方法来解决这个问题,而变量变为null

       protected Map<String, String> getParams(){
            Map<String, String> params = new HashMap<String, String>();
            params.put("key1", value1);
            params.put("key2",value2);
            params.put("key3",value3);
            return checkParams(params);
        };

        private Map<String, String> checkParams(Map<String, String> map){               
            Iterator<Entry<String, String>> it = map.entrySet().iterator();
            while (it.hasNext()) {
                Map.Entry<String, String> pairs = (Map.Entry<String, String>)it.next();
                if(pairs.getValue()==null){
                    map.put(pairs.getKey(), "");
                }
            }
            return map;             
        }

我认为这比在将每个值放入映射

之前检查每个值更容易。

在Volley Request类中调用getBody()方法调用的encodeParameters方法

getBody()方法中,它检查所有的params

 public byte[] getBody() throws AuthFailureError {
        Map<String, String> params = getParams();
        if (params != null && params.size() > 0) {
            return encodeParameters(params, getParamsEncoding());
        }
        return null;
    }

,但不能用于单个参数。所以你必须检查getParams()方法中单个参数的可为空性,比如

  protected Map<String, String> getParams(){
            Map<String, String> params = new HashMap<String, String>();
            params.put("tag", "SHOW_FILE");
            if(filename != null)params.put("filename",filename);
            return params;
        };

最新更新