Google地图在两项活动之间崩溃

时间:2013-10-18 07:58:09

标签: android google-maps

我在我的应用程序中使用谷歌地图。第一次正确加载谷歌地图时,页面上有一个按钮,但再次转到该页面并单击该按钮会使我的应用程序崩溃。

这是我的代码:

public class GoogleMaps extends Activity {

    MapFragment googleMapFragment = null;
    private static GoogleMap googleMap = null;
    private String provider;
    MarkerOptions marker;
    double latitude, longitude;
    private LocationManager locationManager;
    ParseGeoPoint myLatLng[];
    int count_place, i = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.googlemap_view);
        try {
            initilizeMap();
            initParse();
        } catch (Exception e) {
            // TODO: handle exception
            Toast.makeText(getApplicationContext(), e.toString(),
                    Toast.LENGTH_SHORT).show();
        }
    }

    private void initParse() {
        // TODO Auto-generated method stub
        Parse.initialize(this, "key","key");
        ParseObject plcobj = new ParseObject("Details");
        getLatLong();
        ParseGeoPoint myGeoPiont = new ParseGeoPoint(latitude, longitude);
        ParseGeoPoint userLocation = (ParseGeoPoint) plcobj.get("location");
        final ParseQuery query = ParseQuery.getQuery("Details");
        query.whereNear("location", myGeoPiont);
        query.setLimit(10);
        query.whereWithinKilometers("location", myGeoPiont, 10);
        query.findInBackground(new FindCallback() {

            @Override
            public void done(List objects, ParseException e) {
                // TODO Auto-generated method stub

                if (e == null) {
                    Iterator Itr = objects.iterator();
                    while (Itr.hasNext()) {
                        ParseObject plcObjNext = (ParseObject) Itr.next();
                        myLatLng[i] = plcObjNext.getParseGeoPoint("location");
                        i++;  // Line 76

                    }
                }
            }
        });
    }

    private void initilizeMap() {
        if (googleMap == null) {
            googleMapFragment = ((MapFragment) getFragmentManager()
                    .findFragmentById(R.id.map));
            googleMap = googleMapFragment.getMap();
            googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

            if (googleMap == null) {
                Toast.makeText(getApplicationContext(),
                        "Sorry! unable to create maps", Toast.LENGTH_SHORT)
                        .show();
            }
            googleMap.setMyLocationEnabled(true);
            Log.e("Maps", "------EOC-------");
            // Get the location manager

        }
    }

    public void getLatLong() {
        GPSTracker gps = new GPSTracker(GoogleMaps.this);
        if (gps.canGetLocation()) {
            longitude = gps.getLongitude();
            latitude = gps.getLatitude();
            Toast.makeText(getApplicationContext(), longitude + " " + latitude,
                    Toast.LENGTH_SHORT).show();
        } // return boolean true/false
        else {
            gps.showSettingsAlert();
        }
    }
}

这是我的日志:

10-18 13:37:24.219 E/AndroidRuntime(21624): FATAL EXCEPTION: main
10-18 13:37:24.219 E/AndroidRuntime(21624): java.lang.NullPointerException
10-18 13:37:24.219 E/AndroidRuntime(21624): at com.example.restaurantfinder.GoogleMaps$1.done(GoogleMaps.java:76)
10-18 13:37:24.219 E/AndroidRuntime(21624): at com.parse.FindCallback.internalDone(FindCallback.java:45)
10-18 13:37:24.219 E/AndroidRuntime(21624): at com.parse.FindCallback.internalDone(FindCallback.java:1)
10-18 13:37:24.219 E/AndroidRuntime(21624): at com.parse.Parse$6$1.run(Parse.java:888)
10-18 13:37:24.219 E/AndroidRuntime(21624): at android.os.Handler.handleCallback(Handler.java:605)
10-18 13:37:24.219 E/AndroidRuntime(21624): at android.os.Handler.dispatchMessage(Handler.java:92)
10-18 13:37:24.219 E/AndroidRuntime(21624): at android.os.Looper.loop(Looper.java:137)
10-18 13:37:24.219 E/AndroidRuntime(21624): at android.app.ActivityThread.main(ActivityThread.java:4517)
10-18 13:37:24.219 E/AndroidRuntime(21624): at java.lang.reflect.Method.invokeNative(Native Method)
10-18 13:37:24.219 E/AndroidRuntime(21624): at java.lang.reflect.Method.invoke(Method.java:511)
10-18 13:37:24.219 E/AndroidRuntime(21624): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
10-18 13:37:24.219 E/AndroidRuntime(21624): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
10-18 13:37:24.219 E/AndroidRuntime(21624): at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:0)

所以你在initilizeMap();内调用initParse();然后initParse我们有一个对象列表。因此,当您从一个活动转到另一个活动时,对象将变为空。当你回来时,尝试通过将对象保存到某个地方来获取对象。

答案 1 :(得分:0)

您的问题是一个空的ParseGeoPoint数组。

当编译器看到ParseGeoPoint myLatLng[];时,它将创建一个指向没有内存的空数组的指针,因此当您尝试通过myLatLng[i]访问该内存时,由于该内存确实会返回空指针不存在,并且写入空指针会引发NullPointerException,因为您需要意识到这种错误。您不想写任何东西,以后也不想拥有数据。在C语言中,如果您写入一个空数组,它将覆盖内存的另一部分,而不是引发异常,从而可能导致难以跟踪的错误。

在尝试写入数组之前,需要以适当的大小初始化数组。在Java中,使用以下语法将数组初始化为固定长度,该语法的长度为3:

ParseGeoPoint myLatLng[] = new ParseGeoPoint[3];

或在ParseGeoPoint myLatLng[];之后的某个时间键入myLatLng[] = new ParseGeoPoint[3];

在您的情况下:

myLatLng[] = new ParseGeoPoint[objects.size()];,然后遍历对象并尝试写入数组。您不能写入空指针。您需要告诉编译器指向何处以及要分配多少空间。

在处理项目列表时,您可能会发现ArrayList和其他List对象是有帮助的。它们提供了许多方便的方法,可以在您需要它们并且不需要固定长度的情况下节省您的时间。当您添加时,它们会提供不断增加的存储,直到内存用完。

它将极大地帮助您,并节省大量时间来学习如何调试空指针。它们是一个非常常见的异常,在大多数情况下,调试空指针很简单。