【问题标题】:java.lang.nullpointerexception attempt to invoke method 'int java.util.List.size()' [duplicate]java.lang.nullpointerexception 尝试调用方法'int java.util.List.size()' [重复]
【发布时间】:2015-07-14 11:19:29
【问题描述】:

主要活动

正在尝试添加谷歌地图,请尽快提供帮助

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.json.JSONObject;

import android.app.ActionBar;
import android.content.Intent;
import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.PolylineOptions;
import com.parse.ParseAnalytics;
import com.parse.ParseUser;

public class OnscreenActivity extends FragmentActivity {

    private static final LatLng sydney = new LatLng(30.8894669, 75.8246729);
    private static final LatLng connct = new LatLng(30.8914863, 75.874398);
    GoogleMap googleMap;
    final String TAG1 = "PathGoogleMapActivity";

    public static final String TAG = OnscreenActivity.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);
        SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.fragment1);
        googleMap = fm.getMap();
        ParseAnalytics.trackAppOpened(getIntent());
        ParseUser currentUser = ParseUser.getCurrentUser();
        if (currentUser == null) {
            navigateToLogin();
        } else {
            Log.i(TAG, currentUser.getUsername());
        }
        ActionBar actionbar = getActionBar();
        actionbar.show();
        MarkerOptions options = new MarkerOptions();
        options.position(sydney);
        options.position(connct);
        googleMap.addMarker(options);
        String url = getMapsApiDirectionsUrl();
        ReadTask downloadTask = new ReadTask();
        downloadTask.execute(url);

        googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(connct, 16));
        addMarkers();

    }

    private void addMarkers() {
        // TODO Auto-generated method stub
        if (googleMap != null) {
            googleMap.addMarker(new MarkerOptions().position(sydney).title(
                    "First Point"));
            googleMap.addMarker(new MarkerOptions().position(connct).title(
                    "Second Point"));

        }

    }

    private String getMapsApiDirectionsUrl() {
        String waypoints = "waypoints=optimize:true|" + sydney.latitude + ","
                + sydney.longitude + "|" + "|" + connct.latitude + ","
                + connct.longitude;

        String sensor = "sensor=false";
        String params = waypoints + "&" + sensor;
        String output = "json";
        String url = "https://maps.googleapis.com/maps/api/directions/"
                + output + "?" + params;
        return url;

    }

    private class ReadTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... url) {
            String data = "";
            try {
                HttpConnection http = new HttpConnection();
                data = http.readUrl(url[0]);
            } catch (Exception e) {
                Log.d("Background Task", e.toString());
            }
            return data;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            new ParserTask().execute(result);
        }
    }

    private class ParserTask extends
            AsyncTask<String, Integer, List<List<HashMap<String, String>>>> {

        @Override
        protected List<List<HashMap<String, String>>> doInBackground(
                String... jsonData) {

            JSONObject jObject;
            List<List<HashMap<String, String>>> routes = null;

            try {
                jObject = new JSONObject(jsonData[0]);
                PathJsonParser parser = new PathJsonParser();
                routes = parser.parse(jObject);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return routes;
        }

        @Override
        protected void onPostExecute(List<List<HashMap<String, String>>> routes) {
            ArrayList<LatLng> points = null;
            PolylineOptions polyLineOptions = null;

            // traversing through routes
            for (int i = 0; i < routes.size(); i++) {
                points = new ArrayList<LatLng>();
                polyLineOptions = new PolylineOptions();
                List<HashMap<String, String>> path = routes.get(i);

                for (int j = 0; j < path.size(); j++) {
                    HashMap<String, String> point = path.get(j);

                    double lat = Double.parseDouble(point.get("lat"));
                    double lng = Double.parseDouble(point.get("lng"));
                    LatLng position = new LatLng(lat, lng);

                    points.add(position);
                }

                polyLineOptions.addAll(points);
                polyLineOptions.width(2);
                polyLineOptions.color(Color.BLUE);
            }

            googleMap.addPolyline(polyLineOptions);
        }
    }

    private void navigateToLogin() {
        Intent intent = new Intent(this, Login.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(intent);
    }

    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.map, menu);
        return true;
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        int itemId = item.getItemId();
        if (itemId == R.id.action_logout) {
            ParseUser.logOut();
            navigateToLogin();

        }
        if (itemId == R.id.options) {
            Intent intent = new Intent(this, UserOptions.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity(intent);
        }
        return super.onOptionsItemSelected(null);

    }

}

【问题讨论】:

  • 帮助具体是什么?这个异常是在哪个变量/方法调用上抛出的?
  • java.util.List.size()
  • 你有 List>> routes = null;然后尝试获取已设置为 null 的此 List 对象的大小。
  • 那我该怎么办
  • 好吧,我建议你先开始学习Java的基础知识。

标签: java exception null


【解决方案1】:

我们不可能准确地告诉您为什么 ParserTask 中的 onPostExecute 中的 routes 列表为空,但确实如此。

如果打算让 ParserTask 中的 doInBackground 可以返回 null,那么在尝试对它进行任何操作之前,您至少应该检查 routes 变量是否为 null。这不会修复错误,并且可能会导致您的应用无法执行应有的操作,但正如我之前提到的,如果没有完整的日志,就无法再告诉您。

if (routes == null) return; 将抑制错误,但只有在读取多个 json 文件并且其中一些文件实际解析时才能解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-25
    • 2019-12-20
    • 2015-07-16
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 2020-05-05
    • 2019-04-23
    相关资源
    最近更新 更多