1

I have been trying to learn a bit about Android Development. After a couple of "Hello World" and simple App, i decided i would like to make something i could actually use: a simple Weather App. I found a nice tutorial, so i was following that.

Instead of just copy and pasting it, i have been reading through it, trying to understand it and adapting it to my own project.

When i try to run it on my phone i get this Error on the Android Monitor:

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
    Process: com.anatis.ueder, PID: 29363
    java.lang.RuntimeException: An error occured while executing doInBackground()
      at android.os.AsyncTask$3.done(AsyncTask.java:304)
      at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
      at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
      at java.util.concurrent.FutureTask.run(FutureTask.java:242)
      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
      at java.lang.Thread.run(Thread.java:818)
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
      at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
      at org.json.JSONTokener.nextValue(JSONTokener.java:94)
      at org.json.JSONObject.<init>(JSONObject.java:156)
      at org.json.JSONObject.<init>(JSONObject.java:173)
      at com.anatis.ueder.JSONWeatherParser.getWeather(JSONWeatherParser.java:17)
      at com.anatis.ueder.MainActivity$JSONWeatherTask.doInBackground(MainActivity.java:63)
      at com.anatis.ueder.MainActivity$JSONWeatherTask.doInBackground(MainActivity.java:55)
      at android.os.AsyncTask$2.call(AsyncTask.java:292)
      at java.util.concurrent.FutureTask.run(FutureTask.java:237)
      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
      at java.lang.Thread.run(Thread.java:818)

ai, ai, ai... i have no idea what this means! I have read through other thread about this AsyncTask #1, but i couldn't figure out what the problem was. I also don't know where the problem is, so i don't know what code i should post here. This id the doInBackground()

@Override
    protected Weather doInBackground(String... params) {
        Weather weather = new Weather();
        String data = ( (new WeatherHttpClient()).getWeatherData(params[0]));

        try {
            weather = JSONWeatherParser.getWeather(data);

            // Let's retrieve the icon
            weather.iconData = ( (new WeatherHttpClient()).getImage(weather.currentCondition.getIcon()));

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

and here is the getWeather() from the JSONWeatherParser.java

public static Weather getWeather(String data) throws JSONException {
    Weather weather = new Weather();

    // We create out JSONObject from the data
    JSONObject jObj = new JSONObject(data);

    // We start extracting the info
    Location loc = new Location();

    JSONObject coordObj = getObject("coord", jObj);
    loc.setLatitude(getFloat("lat", coordObj));
    loc.setLongitude(getFloat("lon", coordObj));

    JSONObject sysObj = getObject("sys", jObj);
    loc.setCountry(getString("country", sysObj));
    loc.setSunrise(getInt("sunrise", sysObj));
    loc.setSunset(getInt("sunset", sysObj));
    loc.setCity(getString("name", jObj));
    weather.location = loc;

    // We get weather info (This is an array)
    JSONArray jArr = jObj.getJSONArray("weather");

    // We use only the first value
    JSONObject JSONWeather = jArr.getJSONObject(0);
    weather.currentCondition.setWeatherId(getInt("id", JSONWeather));
    weather.currentCondition.setDescr(getString("description", JSONWeather));
    weather.currentCondition.setCondition(getString("main", JSONWeather));
    weather.currentCondition.setIcon(getString("icon", JSONWeather));

    JSONObject mainObj = getObject("main", jObj);
    weather.currentCondition.setHumidity(getInt("humidity", mainObj));
    weather.currentCondition.setPressure(getInt("pressure", mainObj));
    weather.temperature.setMaxTemp(getFloat("temp_max", mainObj));
    weather.temperature.setMinTemp(getFloat("temp_min", mainObj));
    weather.temperature.setTemp(getFloat("temp", mainObj));

    // Wind
    JSONObject wObj = getObject("wind", jObj);
    weather.wind.setSpeed(getFloat("speed", wObj));
    weather.wind.setDeg(getFloat("deg", wObj));

    // Clouds
    JSONObject cObj = getObject("clouds", jObj);
    weather.clouds.setPerc(getInt("all", cObj));

    // We download the icon to show


    return weather;
}

Any ideas of what is going on and how i could fix it?

Please, if you need to see any other code let me know.

I really appreciate all help i can get ( i was hoping to get this to work before Christmas, so i could give the app to my father as Christmas Present... ;) )

Thank you!!!

Boguz
  • 1,600
  • 1
  • 12
  • 25
  • your error is java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference so please update your code – curiousMind Dec 03 '15 at 10:40
  • 1
    what is JSONWeatherParser.java:17 ??? – nano_nano Dec 03 '15 at 10:41
  • Aashvi, how should i update the code? Stefan, the JSONWeatherParser.java is a class i copied from the tutorial. ou can see it [here](https://github.com/survivingwithandroid/Swa-app/blob/master/WeatherApp/src/com/survivingwithandroid/weatherapp/JSONWeatherParser.java), i just updated then the package name to fit my project – Boguz Dec 03 '15 at 10:52
  • You should try to put a log over the string who's length you are trying the fetch and see what it is returning.. through log cat – Hemant Ukey Dec 03 '15 at 11:04
  • man your code is incomplete, where are fetching the length of string ? – Rahul Dec 03 '15 at 11:08
  • :/ i don't know. I was just following the tutorial. i have almost no idea at all what all the code means... :( – Boguz Dec 03 '15 at 11:49
  • You need to post your `JSONWeatherParser.getWeather` source – tato.rodrigo Dec 03 '15 at 11:53
  • tato.rodrigo, i updated the question, i added the getWeather() from the JSONWeatherParser. – Boguz Dec 04 '15 at 06:04

0 Answers0