VolleyPlus: NetworkDispatcher.run: 未处理的异常 java.lang.NullPointerException

8

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

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特定的问题。因此,将这个问题标记为重复是错误的。 - Olcay Ertaş
JWTSigner 是什么? - Blackbelt
Java Web Token库。https://github.com/auth0/java-jwt - Olcay Ertaş
1
我不确定,但这可能是由于parsenetworkresponse引起的异常。尝试在StringRequest中重写parsenetworkresponse方法。虽然不完全相同,但这可能会有所帮助:https://dev59.com/UGIk5IYBdhLWcg3wdd0l - mubeen
4个回答

9

您需要在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 :) - Olcay Ertaş
1
我很高兴赏金没有浪费。 - Olcay Ertaş

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。我在params(5)处得到了一个空白的toast,这表明传递的值为空。 - Kenny Dabiri

1
我追踪了堆栈跟踪,认为根本原因是response.headers在某些情况下为null,导致parseNetworkResponse方法出现问题。我建议执行以下操作以确认此事。
  1. Create a class that extends StringRequest
  2. In this class override the 'parseNetworkResponse()`. It should look as follows:

       protected Response<String> parseNetworkResponse(NetworkResponse response) {
              Log.d("Response Header = " + response.headers);
              super.parseNetworkResponse(response);
       }
    
  3. Use this class instead of StringRequest.

完成后,查看标头是否为空。这应该能够缩小问题范围。顺便问一下,您正在使用哪个版本的Volley?我从未遇到过这样的问题。

-2
我在 build.gradle.dependencies 中编写了这段代码。
compile 'com.android.volley:volley:1.0.0'

它起作用了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接