Google 地图崩溃 null LatLng

3
所以我有我的谷歌地图,我从服务器获取纬度和经度作为字符串,然后将它们转换为LatLng位置。我遇到的问题是,如果手机没有捕获GPS位置,它会在我的数据库中存储一个空字符串,然后当Google地图尝试显示它时,它会使所有试图访问地图的用户的应用程序崩溃。我得出的结论是由于空字符串,因为如果我从数据库中删除那个空字符串,一切都能正常工作。我需要知道的是检查空字符串或null LatLng的最佳方法并跳过它,以便它不会崩溃。
编辑代码已更新。
for (int i = 0; i < marker_list.size(); i+=2)
{
              String lat = marker_list.get(i);
              String lng = marker_list.get(i+1);

              // NEED TO MAKE SURE CHECK BEFORE HERE AND IF LOCATION DOESN'T EXIST SKIP TO NEXT.
              if (lat == "" || lng == "")
              {
                  continue;
              }
              else
{
              double lat_ = Double.valueOf(lat);
          double lng_ = Double.valueOf(lng);

              LatLng location = new LatLng(lat_, lng_);

              map.addMarker(new MarkerOptions()
                    .position(location)
                    .title(title)
                    .snippet(index)
                    .icon(BitmapDescriptorFactory.fromResource(R.drawable.event)));
 }

}


01-28 00:33:58.060: E/AndroidRuntime(919): FATAL EXCEPTION: main
01-28 00:33:58.060: E/AndroidRuntime(919): Process: com.databasedemo, PID: 919
01-28 00:33:58.060: E/AndroidRuntime(919): java.lang.NumberFormatException: Invalid double: ""
01-28 00:33:58.060: E/AndroidRuntime(919):  at java.lang.StringToReal.invalidReal(StringToReal.java:63)
01-28 00:33:58.060: E/AndroidRuntime(919):  at java.lang.StringToReal.parseDouble(StringToReal.java:248)
01-28 00:33:58.060: E/AndroidRuntime(919):  at java.lang.Double.parseDouble(Double.java:295)
01-28 00:33:58.060: E/AndroidRuntime(919):  at java.lang.Double.valueOf(Double.java:332)
01-28 00:33:58.060: E/AndroidRuntime(919):  at com.databasedemo.Map$PrefetchData.onPostExecute(Map.java:257)
01-28 00:33:58.060: E/AndroidRuntime(919):  at com.databasedemo.Map$PrefetchData.onPostExecute(Map.java:1)
01-28 00:33:58.060: E/AndroidRuntime(919):  at android.os.AsyncTask.finish(AsyncTask.java:632)
01-28 00:33:58.060: E/AndroidRuntime(919):  at android.os.AsyncTask.access$600(AsyncTask.java:177)
01-28 00:33:58.060: E/AndroidRuntime(919):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
01-28 00:33:58.060: E/AndroidRuntime(919):  at android.os.Handler.dispatchMessage(Handler.java:102)
01-28 00:33:58.060: E/AndroidRuntime(919):  at android.os.Looper.loop(Looper.java:136)
01-28 00:33:58.060: E/AndroidRuntime(919):  at android.app.ActivityThread.main(ActivityThread.java:5017)
01-28 00:33:58.060: E/AndroidRuntime(919):  at java.lang.reflect.Method.invokeNative(Native Method)
01-28 00:33:58.060: E/AndroidRuntime(919):  at java.lang.reflect.Method.invoke(Method.java:515)
01-28 00:33:58.060: E/AndroidRuntime(919):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
01-28 00:33:58.060: E/AndroidRuntime(919):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
01-28 00:33:58.060: E/AndroidRuntime(919):  at dalvik.system.NativeStart.main(Native Method)

1
请发布您的logcat错误。您是否得到了 String latString lng 为空的情况? - GrIsHu
如果您想检查字符串是否具有值“null”,请使用if(“null”。equals(lat)&&“null”。equals(lng))而不是。 - M D
仍然出现同样的错误,使用if("null".equals(lat) && "null".equals(lng))。 - Jayce
3个回答

1
尝试以下操作:

     String lat = marker_list.get(i);
     String lng = marker_list.get(i+1);
     if(!lat.isEmpty() && !lng.isEmpty())
     {
        try{
         double lat_ = Double.parseDouble(lat);
         double lng_ = Double.parseDouble(lng);
    }catch(NumberFormatException e){}
       }

无法保存。在此行上,lat_,lng_无法解析为变量。LatLng location = new LatLng(lat_, lng_); - Jayce
这里没有使用try catch的意义。即使捕获了异常,值仍然是错误的。 - Ogen
检查字符串的空值。请检查我的更新答案。你是否得到了 lat lng 值? - GrIsHu
我使用了 if(lat.isEmpty() && lng.isEmpty()){ continue; } 这段代码,它很有效。非常感谢。 - Jayce

0
在声明字符串后加入这一行。
if (lat == "" || lng == "") {
   continue;
}

这将跳过迭代,其中含有空字符串并给您提供空位置的情况


@user3186578 没有错误信息,你将无法得到正确的解决方案,请发布你所遇到的错误。 - GrIsHu
尝试将“”更改为null。我认为该字符串为null,而不是空的。因此,如果(lat == null || lng == null),就会这样说。 - Ogen
添加了logcat。我知道它是双重的,只是不确定如何检查它。我也尝试过lat lng == null,但仍然一样。我需要检查双重而不是null吗? - Jayce
请查看我的更新代码,现在它的样子是这样的。所以我仍然不确定。 - Jayce
在if语句之前添加System.out.println(lat + " " + lng),以便一劳永逸地查看它们在崩溃之前的值。 - Ogen
显示剩余9条评论

0
正在发生的是,你从数据库中提取的信息无法格式化为数字。你可以让它工作,但对我来说,最好的解决方案似乎是不要在数据库中存储损坏或无效的值。因此,在将某些东西推送到数据库之前,请等待设备获取位置更新或根本不放置任何东西。此外,为什么将位置存储为字符串?您可以将其作为数字推入,以便每次都无需进行序列化和反序列化。

这是我的第一个Android应用程序,我通常做php/mysql,所以我让它按照我的需求工作。而且不是我存储位置,我让用户存储位置,如果他们在GPS完全锁定之前点击添加位置按钮,则插入空值。 - Jayce

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接