Исключение в асинхронной задаче - PullRequest
0 голосов
/ 15 апреля 2019

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

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

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

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;
    }
}
}

LogCat:

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 Джексона.

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

1 Ответ

1 голос
/ 15 апреля 2019
return (Map) JsonUtils.stringObject(str, Map.class); //Error is here.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...