user1972221
user1972221

Reputation: 13

NumberFormatException when parseing in Android and JSON. String --> double

I am coding an application for android which is supposed to get coordinates from a JSON document, convert this Strings to double and then use this doubles to create overlays on google map.

But i get an exception called 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();
    }

}

    }

Here is my 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 got anny ideas? The logcat tells me i have the data from JSON.

Upvotes: 0

Views: 2933

Answers (3)

T.J. Crowder
T.J. Crowder

Reputation: 1074959

The exception is telling you exactly what's wrong:

NumberFormatException: Invalid double: ""

You're trying to use Double.parseDouble on the string "". That fails. You need to check for the "" case:

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);
}

...and similarly for lng, presumably.

You'll want to catch and handle the exception anyway at some level (in case the incoming JSON is truly invalid, lat: "foo" or similar), but since apparently the input data sometimes has blank lat or lng, that's no longer an exceptional case, and so you can handle it inline using if.

Upvotes: 1

Kai
Kai

Reputation: 113

You need to handle the empty lat value. I see there is such data in the JSON return:

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

So this code throws exception:

double lati = Double.parseDouble(lat);

Upvotes: 0

Mehul Ranpara
Mehul Ranpara

Reputation: 4255

It looks like you doesn't check the (null) condition and here you parse String value which is null and the exception shows that it can't parse null String to Double..So, you have to check the null condition before parse it to Double..Check that and your problem is Solved...Enjoy..:-)

Upvotes: 0

Related Questions