0

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

这是我的代码:

公共类 GoogleMaps 扩展 Activity {

    MapFragment googleMapFragment = null;
    私有静态 GoogleMap googleMap = null;
    私有字符串提供者;
    MarkerOptions 标记;
    双纬、经度;
    私人位置管理器位置管理器;
    ParseGeoPoint myLatLng[];
    int count_place, i = 0;

    @覆盖
    protected void onCreate(Bundle savedInstanceState) {
        // TODO 自动生成的方法存根
        super.onCreate(savedInstanceState);
        setContentView(R.layout.googlemap_view);
        尝试 {
            初始化映射();
            初始化解析();
        } 捕捉(异常 e){
            // TODO: 处理异常
            Toast.makeText(getApplicationContext(), e.toString(),
                    Toast.LENGTH_SHORT).show();
        }
    }

    私人无效initParse(){
        // TODO 自动生成的方法存根
        Parse.initialize(this, "key","key");
        ParseObject plcobj = new ParseObject("Details");
        getLatLong();
        ParseGeoPoint myGeoPint = new ParseGeoPoint(latitude, longitude);
        ParseGeoPoint userLocation = (ParseGeoPoint) plcobj.get("location");
        最终 ParseQuery 查询 = ParseQuery.getQuery("Details");
        query.whereNear("位置", myGeoPint);
        查询.setLimit(10);
        query.whereWithinKilometers("位置", myGeoPint, 10);
        query.findInBackground(new FindCallback() {

            @覆盖
            公共无效完成(列表对象,ParseException e){
                // TODO 自动生成的方法存根

                如果(e == null){
                    迭代器 Itr = objects.iterator();
                    而(Itr.hasNext()){
                        ParseObject plcObjNext = (ParseObject) Itr.next();
                        myLatLng[i] = plcObjNext.getParseGeoPoint("位置");
                        我++;// 第 76 行

                    }
                }
            }
        });
    }

    私人无效初始化映射(){
        如果(googleMap == null){
            googleMapFragment = ((MapFragment) getFragmentManager()
                    .findFragmentById(R.id.map));
            googleMap = googleMapFragment.getMap();
            googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

            如果(googleMap == null){
                Toast.makeText(getApplicationContext(),
                        “抱歉!无法创建地图”,Toast.LENGTH_SHORT)
                        。节目();
            }
            googleMap.setMyLocationEnabled(true);
            Log.e("地图", "-----EOC------");
            // 获取位置管理器

        }
    }

    公共无效getLatLong(){
        GPSTracker gps = new GPSTracker(GoogleMaps.this);
        如果(gps.canGetLocation()){
            经度 = gps.getLongitude();
            纬度 = gps.getLatitude();
            Toast.makeText(getApplicationContext(), 经度 + " " + 纬度,
                    Toast.LENGTH_SHORT).show();
        } // 返回布尔值 true/false
        别的 {
            gps.showSettingsAlert();
        }
    }
}

这是我的日志:

10-18 13:37:24.219 E/AndroidRuntime(21624): 致命异常: main
10-18 13:37:24.219 E/AndroidRuntime(21624): java.lang.NullPointerException
10-18 13:37:24.219 E/AndroidRuntime(21624): 在 com.example.restaurantfinder.GoogleMaps$1.done(GoogleMaps.java:76)
10-18 13:37:24.219 E/AndroidRuntime(21624): 在 com.parse.FindCallback.internalDone(FindCallback.java:45)
10-18 13:37:24.219 E/AndroidRuntime(21624): 在 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): 在 android.os.Handler.handleCallback(Handler.java:605)
10-18 13:37:24.219 E/AndroidRuntime(21624): 在 android.os.Handler.dispatchMessage(Handler.java:92)
10-18 13:37:24.219 E/AndroidRuntime(21624): 在 android.os.Looper.loop(Looper.java:137)
10-18 13:37:24.219 E/AndroidRuntime(21624): 在 android.app.ActivityThread.main(ActivityThread.java:4517)
10-18 13:37:24.219 E/AndroidRuntime(21624): 在 java.lang.reflect.Method.invokeNative(Native Method)
10-18 13:37:24.219 E/AndroidRuntime(21624): 在 java.lang.reflect.Method.invoke(Method.java:511)
10-18 13:37:24.219 E/AndroidRuntime(21624): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
10-18 13:37:24.219 E/AndroidRuntime(21624): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
10-18 13:37:24.219 E/AndroidRuntime(21624): 在 dalvik.system.NativeStart.main(Native Method)
4

2 回答 2

0

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

于 2018-05-17T08:36:44.863 回答
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它们提供了许多方便的方法,如果您需要它们可以节省您的时间,并且它们不需要固定的长度。它们会在您添加时提供越来越多的存储空间,直到您耗尽内存。

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

于 2020-10-29T22:41:09.703 回答