尝试解析器JSON java.lang.NullPointerException时出错

时间:2015-12-23 20:26:53

标签: java android json

我正在尝试从URL发出请求以获取JSON并解析来自android的listView中的这个JSON,但是我收到错误并且我的应用程序关闭

有关详细信息,请参阅我的课程:

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



    }
}

当我打开我的应用程序时,他关闭,然后在我的日志中返回

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 个答案:

答案 0 :(得分:1)

如果后台线程中有异常,则返回null。这会导致将适配器的List设置为null,这会在ListView尝试生成其View时抛出NPE。

尝试返回空列表。