0

I'm trying to make a request from URL to get JSON and parser this JSON in listView from android, but I receive an error and my application closes

For more details, here is my classes:

 public class JSONTask extends AsyncTask<String, String, List<MovieModel>>{


    @Override
    protected List<MovieModel> doInBackground(String... params) {

        HttpURLConnection connection = null;
        BufferedReader reader = null;

        try {
            URL url = new URL(params[0]);
            connection = (HttpURLConnection) url.openConnection();
            connection.connect();
            InputStream stream = connection.getInputStream();
            reader = new BufferedReader(new InputStreamReader(stream));
            StringBuffer buffer = new StringBuffer();
            String line = "";
            while ((line = reader.readLine()) != null){
                buffer.append(line);
            }

            String finalJson = buffer.toString();

            JSONObject parentObject = new JSONObject(finalJson);
            JSONArray parentArray = parentObject.getJSONArray("movies");

            List<MovieModel> movieModelList = new ArrayList<>();
            for (int i=0; i<parentArray.length(); i++){
                JSONObject finalObject = parentArray.getJSONObject(i);
                MovieModel movieModel = new MovieModel();
                movieModel.setMovie(finalObject.getString("name"));
                movieModel.setYear(finalObject.getInt("year"));
                movieModel.setRating((float) finalObject.getDouble("rating"));
                movieModel.setDuration(finalObject.getString("duration"));
                movieModel.setDirector(finalObject.getString("director"));
                movieModel.setTagline(finalObject.getString("tagline"));
                movieModel.setImage(finalObject.getString("image"));
                movieModel.setStory(finalObject.getString("story"));

                List<MovieModel.Cast> castList = new ArrayList<>();
                for (int j=0; j<finalObject.getJSONArray("stars").length(); j++){
                    MovieModel.Cast cast = new MovieModel.Cast();
                    cast.setName(finalObject.getJSONArray("stars").getJSONObject(j).getString("name"));
                    castList.add(cast);
                }
                movieModel.setCastList(castList);
                // Add the final object in the list
                movieModelList.add(movieModel);
            }
            return movieModelList;

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        } finally {
            if (connection != null){
                connection.disconnect();
            }

            try {
                if (reader != null){
                    reader.close();
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    protected void onPostExecute(List<MovieModel> result) {
        super.onPostExecute(result);

        MovieAdapter adapter = new MovieAdapter(getApplicationContext(), R.layout.row, result);
        lvMovies.setAdapter(adapter);



    }
}

And when i open my aplication, he close, and return this in my log

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.helio.minhaaplicacao, PID: 9419
java.lang.NullPointerException
at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:330)
at android.widget.ListView.setAdapter(ListView.java:480)
at com.example.helio.minhaaplicacao.MainActivity$JSONTask.onPostExecute(MainActivity.java:185)
at com.example.helio.minhaaplicacao.MainActivity$JSONTask.onPostExecute(MainActivity.java:106)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5021)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:827)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:643)
at dalvik.system.NativeStart.main(Native Method)

1 Answer 1

1

In the event that you have an exception in your background thread, you return null. This results in setting your adapter's List to null, which throws the NPE when the ListView attempts to generate its View.

Try returning an empty List instead.

Sign up to request clarification or add additional context in comments.

1 Comment

Hey, I got, it was a lack of attention, the JSON Object Array "story" not exists, is "sumarry", but still thank you

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.