Исключение в асинхронной задаче

Что такое исключение NullPointerException и как его исправить? Я задаю этот вопрос после того, как сослался на множество ответов об исключении нулевого указателя в Stack Overflow. Я перепробовал много методов и потерпел неудачу.

Итак, проблема в том, что я получаю исключение нулевого указателя в асинхронной задаче. Я оставлю кусок кода, который отвечает за эту ошибку.

Ниже приведен класс, в котором я получаю сообщение об ошибке.

GetArrayAsyncTask:

@TargetApi(19)
public Map doInBackground(String... strArr) {
    StringBuffer stringBuffer = new StringBuffer();
    String str = null;
    try {
        HttpURLConnection httpURLConnection = (HttpURLConnection) new URL(strArr[0]).openConnection();
        httpURLConnection.setRequestMethod("GET");
        httpURLConnection.connect();
        InputStream inputStream = httpURLConnection.getInputStream();
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        while (true) {
            String readLine = bufferedReader.readLine();
            if (readLine == null) {
                break;
            }
            stringBuffer.append(readLine);
        }
        bufferedReader.close();
        inputStreamReader.close();
        inputStream.close();
        httpURLConnection.disconnect();
        String stringBuffer2 = stringBuffer.toString();
        if (!stringBuffer2.contains("host") && !stringBuffer2.contains("version")) {
            boolean contains = stringBuffer2.contains("http");
        }
        List list = JsonHelper.toList(new JSONArray(stringBuffer2));
        HashMap hashMap = new HashMap();
        hashMap.put("data", list);
        return hashMap;
    } catch (MalformedURLException unused) {
    } catch (ProtocolException unused2) {
    } catch (IOException unused3) {
    } catch (JSONException unused) {
        return (Map) JsonUtils.stringObject(str, Map.class); //Error is here.
    }
    return null;
}

public void onPostExecute(Map map) {
    if (map == null || map.size() <= 0) {
        Toast.makeText(this.context, "Data format error!", Toast.LENGTH_LONG).show();
        this.listener.onGetArrayResultsData(map, this.request_code);
        return;
    }
    this.listener.onGetArrayResultsData(map, this.request_code);
}

Исключение происходит в return (Map) JsonUtils.stringObject(str, Map.class);

JsonUtils:

public class JsonUtils {
public static String jsonString(Object obj) {
    try {
        return new ObjectMapper().writeValueAsString(obj);
    } catch (JsonProcessingException unused) {
        return null;
    }
}

public static <T> T stringObject(String str, Class<T> cls) {
    try {
        return new ObjectMapper().readValue(str, cls); //Error line.
    } catch (JsonParseException unused) {
        return null;
    } catch (JsonMappingException unused2) {
        return null;
    } catch (IOException unused3) {
        return null;
    }
}
}

Логкат:

java.lang.RuntimeException: An error occurred while executing doInBackground()
    at android.os.AsyncTask$3.done(AsyncTask.java:318)
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
    at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
    at java.util.concurrent.FutureTask.run(FutureTask.java:242)
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
    at java.lang.Thread.run(Thread.java:760)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
    at com.fasterxml.jackson.core.JsonFactory.createParser(JsonFactory.java:889)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3004)
    at converter.JsonUtils.stringObject(JsonUtils.java:20)
    at com.kds.gold.pi.asyncs.GetArrayAsyncTask.doInBackground(GetArrayAsyncTask.java:111)
    at com.kds.gold.pi.asyncs.GetArrayAsyncTask.doInBackground(GetArrayAsyncTask.java:24)

В этом проекте используется более быстрая XML-библиотека Jackson.

Редактировать: После некоторых модификаций я столкнулся с одной странной проблемой после инициализации str с помощью " " вместо нуля (this actually solved null pointer exception but led to functional issue). Когда я добавляю точку останова в эту строку (return (Map) JsonUtils.stringObject(str, Map.class); //Error is here) и выполняю отладку, приложение работает нормально. Принимая во внимание, что когда я запускаю его в обычном режиме, он выдает Data format error! Toast, как определено в методе выполнения onPost.

Пожалуйста, отредактируйте свой вопрос и опубликуйте всю трассировку стека, связанную с NullPointerException.

CommonsWare 15.04.2019 16:08

Добавлен журнал сбоев.

Nithis Kumar 15.04.2019 16:09
0
2
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
return (Map) JsonUtils.stringObject(str, Map.class); //Error is here.

str есть null. Кажется, вы никогда не присваиваете ему значение. И, поскольку эта строка кода находится в блоке catch, возможно, что исключение возникнет до того, как вы все равно присвоите значение str.

Спасибо за помощь, приятель. Я столкнулся с одной странной проблемой: после инициализации str с помощью " " вместо null. Когда я добавляю точку останова в эту строку, приложение отладки работает нормально. Принимая во внимание, что когда я запускаю его в обычном режиме, он выдает Data format error! Toast, как определено в методе выполнения onPost. Что может быть причиной?

Nithis Kumar 15.04.2019 16:46

@NithisKumar: Хм, ну, " " не является JSON-представлением Map.

CommonsWare 15.04.2019 23:27

Другие вопросы по теме