【问题标题】:VolleyPlus : NetworkDispatcher.run: Unhandled exception java.lang.NullPointerExceptionVolleyPlus:NetworkDispatcher.run:未处理的异常 java.lang.NullPointerException
【发布时间】:2015-10-08 13:53:14
【问题描述】:

我正在尝试运行以下代码:

Map<String, Object> requestMap = new HashMap<>();
Long unixTime = System.currentTimeMillis() / LONG_1000;
requestMap.put(KEY_TIME, unixTime);
JWTSigner signer = new JWTSigner(SECRET);
String token = signer.sign(requestMap);
String url = BASE_URI + "/Data/Categories?d=" + token;
StringRequest stringRequest =  new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        Log.d(TAG, response);
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        Log.e(TAG, error.getLocalizedMessage());
    }
});

RequestQueue mRequestQueue = Volley.newRequestQueue(getActivity());
mRequestQueue.add(stringRequest);

但我收到以下错误:

[6056] NetworkDispatcher.run: Unhandled exception java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.Map.get(java.lang.Object)' on a null object reference
java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.Map.get(java.lang.Object)' on a null object reference
    at com.android.volley.toolbox.HttpHeaderParser.parseCharset(HttpHeaderParser.java:243)
    at com.android.volley.toolbox.HttpHeaderParser.parseCharset(HttpHeaderParser.java:262)
    at com.android.volley.request.StringRequest.parseNetworkResponse(StringRequest.java:70)
    at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:133)
java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.Map.get(java.lang.Object)' on a null object reference

我不知道有什么问题。有人可以帮忙吗?

提前致谢。

【问题讨论】:

  • @blackbelt 我知道什么是 NullPointerException。如果您注意到此异常并非直接来自我的代码。这是 VolleyPlus 特有的问题。所以将此问题标记为重复是错误的。
  • JWTSigner 是什么?
  • Java Web 令牌库。 github.com/auth0/java-jwt
  • 我不太清楚,但这是个例外,因为 parsenetworkresponse 。尝试覆盖 StringRequest 中的 parsenetworkresponse 方法。这不完全相同,但这可能会有所帮助stackoverflow.com/questions/19267616/…

标签: android httprequest


【解决方案1】:

您需要覆盖StringRequest 中的parseNetworkResponse 方法并修复一个不会预期空头映射的漏洞:

StringRequest stringRequest =  new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        Log.d(TAG, response);
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        Log.e(TAG, error.getLocalizedMessage());
    }
}) {
    @Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
        if (response.headers == null)
        {
            // cant just set a new empty map because the member is final.
            response = new NetworkResponse(
                               response.statusCode,
                               response.data,
                               Collections.<String, String>emptyMap(), // this is the important line, set an empty but non-null map.
                               response.notModified,
                               response.networkTimeMs);


        }

        return super.parseNetworkResponse(response);
    }
};

希望这会有所帮助。

【讨论】:

  • 非常感谢@gil-moshayof :)
  • 我很高兴赏金没有浪费。
【解决方案2】:

我遇到这个问题是因为 cidEDTValue 为空。

{
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        Map<String, String> params = new HashMap<>();
        params.put("CID", cidEDTValue);
        return params;
    }
}

【讨论】:

  • 这是真的。我有 8 个 params.put("CID", cidEDTValue) 其中一个为空。所以我所做的是使用 Toast 输出每个参数。我在 params(5) 得到了一个空白 toast,这表示传递的值为 null。
【解决方案3】:

我跟踪了堆栈跟踪,我认为根本原因是 response.headers 在方法 parseNetworkResponse 中由于某种原因为空。我建议以下内容来确认这一点。

  1. 创建一个扩展StringRequest的类
  2. 在此类中覆盖“parseNetworkResponse()”。它应该如下所示:

       protected Response<String> parseNetworkResponse(NetworkResponse response) {
              Log.d("Response Header = " + response.headers);
              super.parseNetworkResponse(response);
       }
    
  3. 使用这个类而不是StringRequest

完成后,查看标题是否为空。那应该缩小问题的范围。顺便说一句,您使用的是哪个版本的 Volley。我从来没有遇到过这样的问题。

【讨论】:

    【解决方案4】:

    我在 build.gradle.dependencies 上写了这个。

    compile 'com.android.volley:volley:1.0.0'
    

    它奏效了。

    【讨论】:

      猜你喜欢
      • 2018-11-06
      • 2013-02-12
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      • 2015-07-22
      • 2011-01-16
      相关资源
      最近更新 更多