VolleyPlus: NetworkDispatcher.run: необработанное исключение java.ленг.Исключение NullPointerException
Я пытаюсь запустить ниже код:
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
Я понятия не имею, что такое проблема. Кто-нибудь может помочь?
спасибо заранее.
4 ответов
вам нужно переопределить parseNetworkResponse метод StringRequest и исправить уязвимость, которая не ожидает нулевой карты заголовка:
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);
    }
};
надеюсь, что это помогает.
Я проследил stacktrace, и я считаю, что первопричина response.headers имеет значение null в методе parseNetworkResponse по какой-то причине. Я бы предложил следующее, чтобы подтвердить это.
- создать класс, который расширяет 
StringRequest - 
в этом классе переопределите ' parseNetworkResponse ()'. Он должен выглядеть следующим образом:
protected Response<String> parseNetworkResponse(NetworkResponse response) { Log.d("Response Header = " + response.headers); super.parseNetworkResponse(response); } используйте этот класс вместо
StringRequest.
после этого посмотрите, являются ли заголовки null или не. Это должно сузить проблему. Кстати, какую версию Volley вы используете. Я никогда не сталкивался с такой проблемой.
я столкнулся с этой проблемой, потому что cidEDTValue был null.
{
    @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        Map<String, String> params = new HashMap<>();
        params.put("CID", cidEDTValue);
        return params;
    }
}
Я написал это в build.градля.зависимости.
compile 'com.android.volley:volley:1.0.0'
и это сработало.