【问题标题】:Google Maps gets crash between two activity谷歌地图在两个活动之间崩溃
【发布时间】:2025-12-19 12:25:16
【问题描述】:

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

这是我的代码:

公共类 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)

【问题讨论】:

  • 你的堆栈跟踪在哪里?
  • 提供崩溃日志并过滤您的代码,以便在完成一些作业后提及最小问题引起的区域。这将对我们所有人都有帮助。我们可以轻松理解问题,您可以轻松获得答案。
  • 您是否尝试在模拟器中运行应用程序..?请提供异常详细信息(logcat)。如果需要尝试扩展 FragmentActivity。
  • 显然问题出在 GoogleMaps.java 的第 76 行
  • 点后面的对象为空。我不知道你的行号,但你应该可以找到该行。

标签: android google-maps


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你的问题是一个空的 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 对象很有帮助。它们提供了许多方便的方法,如果您需要它们可以节省您的时间,并且它们不需要固定的长度。它们会在您添加时提供越来越多的存储空间,直到您耗尽内存为止。

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

    【讨论】: