Reputation: 13
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
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
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
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