Что такое исключение 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.