在Android和JSON中解析时的NumberFormatException。字符串 - >双

时间:2013-01-12 11:06:15

标签: android json string parsing double

我正在编写Android应用程序,它应该从JSON文档中获取坐标,将此字符串转换为double,然后使用此双打在Google地图上创建叠加层。

但我得到一个名为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得到了一些想法? logcat告诉我我有来自JSON的数据。

3 个答案:

答案 0 :(得分: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内联处理。

答案 1 :(得分:0)

看起来你没有检查(null)条件,在这里解析String值为null,异常显示它无法将null String解析为Double..So,你必须先检查 null 条件才能解析为Double ..检查一下,你的问题解决了......享受......: - )

答案 2 :(得分:0)

您需要处理空的lat值。我看到JSON返回中有这样的数据:

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

所以这段代码会引发异常:

double lati = Double.parseDouble(lat);