2013-01-12 36 views
0

我正在编写一个应用程序的android应该从JSON文件获取坐标,将此字符串转换为double,然后使用此双打在Google地图上创建叠加层。在Android和JSON中解析时NumberFormatException。字符串 - >双

但我得到一个名为NumberFormatException的异常。

public class LagerActivity extends Activity { 

private static String url = "http://agent.nocrew.org/api/json/1.0/searchStore.json?limit=500"; 

static final String TAG_ITEMS = "items"; 
static final String TAG_LAT = "lat"; 
static final String TAG_LNG = "lng"; 

private GoogleMap mMap; 
private LocationManager locationManager; 

JSONArray items = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_lager); 
    mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)) 
      .getMap(); 

    // Creating JSON Parser instance 
    JSONparser jParser = new JSONparser(); 
    // getting JSON string from URL 
    JSONObject json = jParser.getJSONFromUrl(url); 

    try { 
     // Getting Array of Contacts 
     items = json.getJSONArray(TAG_ITEMS); 
     // looping through All Contacts 
     for (int i = 0; i < items.length(); i++) { 
      JSONObject c = items.getJSONObject(i); 

      // Storing each json item in variable 
      String lat = c.getString(TAG_LAT); 
      String lng = c.getString(TAG_LNG); 

      // lat = lat.replace(",", "."); 
      // lng = lng.replace(",", "."); 

      // Log.e(lat, lng); 

      double lati = Double.parseDouble(lat); 

      Log.d(Double.toString(lati), " "); 

      // LatLng point = new LatLng(Double.parseDouble(lat), 
      // Double.parseDouble(lng)); 
       // mMap.addMarker(new MarkerOptions().position(point) 
      // .title("Karls räkor & hund") 
      // .snippet("blaha, ehehe")); 

     } 

    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

} 

    } 

这里是我的logcat:

01-11 18:10:23.294: W/dalvikvm(22718): threadid=1: thread exiting with uncaught   exception (group=0x40e86930) 
    01-11 18:10:23.294: E/AndroidRuntime(22718): FATAL EXCEPTION: main 
    01-11 18:10:23.294: E/AndroidRuntime(22718): java.lang.RuntimeException: Unable to start activity    ComponentInfo{com.example.checkmypint/com.example.checkmypint.LagerActivity}: java.lang.NumberFormatException: Invalid double: "" 
    01-11 18:10:23.294: E/AndroidRuntime(22718): at   android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
    01-11 18:10:23.294: E/AndroidRuntime(22718): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
    01-11 18:10:23.294: E/AndroidRuntime(22718): at android.app.ActivityThread.access$600(ActivityThread.java:141) 
    01-11 18:10:23.294: E/AndroidRuntime(22718): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
    01-11 18:10:23.294: E/AndroidRuntime(22718): at android.os.Handler.dispatchMessage(Handler.java:99) 
    01-11 18:10:23.294: E/AndroidRuntime(22718): at android.os.Looper.loop(Looper.java:137) 
    01-11 18:10:23.294: E/AndroidRuntime(22718): at android.app.ActivityThread.main(ActivityThread.java:5039) 
    01-11 18:10:23.294: E/AndroidRuntime(22718): at java.lang.reflect.Method.invokeNative(Native Method) 
    01-11 18:10:23.294: E/AndroidRuntime(22718): at java.lang.reflect.Method.invoke(Method.java:511) 
    01-11 18:10:23.294: E/AndroidRuntime(22718): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
    01-11 18:10:23.294: E/AndroidRuntime(22718): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
    01-11 18:10:23.294: E/AndroidRuntime(22718): at dalvik.system.NativeStart.main(Native Method) 
    01-11 18:10:23.294: E/AndroidRuntime(22718): Caused by: java.lang.NumberFormatException: Invalid double: "" 
    01-11 18:10:23.294: E/AndroidRuntime(22718): at java.lang.StringToReal.invalidReal(StringToReal.java:63) 
    01-11 18:10:23.294: E/AndroidRuntime(22718): at java.lang.StringToReal.parseDouble(StringToReal.java:248) 
    01-11 18:10:23.294: E/AndroidRuntime(22718): at java.lang.Double.parseDouble(Double.java:295) 
    01-11 18:10:23.294: E/AndroidRuntime(22718): at com.example.checkmypint.LagerActivity.onCreate(LagerActivity.java:65) 
    01-11 18:10:23.294: E/AndroidRuntime(22718): at android.app.Activity.performCreate(Activity.java:5104) 
    01-11 18:10:23.294: E/AndroidRuntime(22718): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
    01-11 18:10:23.294: E/AndroidRuntime(22718): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
    01-11 18:10:23.294: E/AndroidRuntime(22718): ... 11 more 

Annyone了ANNY想法? logcat告诉我我有来自JSON的数据。

+2

'无效双:“”'你的JSON有一个空字符串,这不是一个有效的解析双。 –

回答

1

唯一的例外是在告诉你正是什么是错的:

NumberFormatException: Invalid double: ""

你试图在字符串""上使用Double.parseDouble。那失败了。你需要检查的""情况:

String lat = c.getString(TAG_LAT); 
double lati; 

if (lat == null || lat.length == 0) { 
    lati = /* use whatever default you want to use here */; 
} 
else { 
    double lati = Double.parseDouble(lat); 
} 

...同样地,对于lng,大概。

你想赶上,并在一定程度上处理异常反正(如果传入的JSON是真正的无效,lat: "foo"或类似),但由于明显的输入数据有时有空白latlng,这是没有更长的例外情况,因此您可以使用if以内联方式处理它。

+0

感谢分配,这没有把戏! – user1972221

0

它看起来像你没有检查(空)条件,在这里你解析字符串值为空,并且异常显示它不能解析空字符串为双倍..所以,你必须检查null条件之前解析它为双倍..检查并解决您的问题...享受.. :-)

+0

我同时显示这两种方式..或者“”或检查null ..dear ... :-) –

+0

@ T.J.Crowder ..我编辑了我的答案任何misguide .. –

0

您需要处理空的纬度值。我看到有在JSON回报这样的数据:

{ 
    "address": "Breared, Vrångagatan 5", 
    "city": "Varberg", 
    "county": "Halland", 
    "county_id": 3, 
    "lat": "", 
    "lng": "", 
    "id": 1331, 
    "sysid": 1310 
}, 

所以这个代码抛出异常:

double lati = Double.parseDouble(lat);