Получение объекта JSONObject и NullPointerException

304
06 февраля 2019, 01:30

Пытаюсь создать тренировочный код, позволяющий выгружать с сайта www.flickr.com данные в фоновый поток и преобразовать в объекты JSONObject

public class BaseFromAPI {
  private static final String TAG = "FlickrFetch";
  private static final String API_KEY = "7997d726ccce33dbd0004e5b2bef67d1";
  public SQLiteDatabase mSQLiteDatabase;
  JSONObject jsonObject;
  public BaseFromAPI() {
  }

  public byte[] getUrlBytes(String urlBase) throws IOException {
    URL url = new URL(urlBase);
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    try {
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      InputStream in = connection.getInputStream();
      if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
        throw new IOException(connection.getResponseMessage() +
          ": with " +
          urlBase);
      }
      int byteRead = 0;
      byte[] buffer = new byte[1024];
      while ((byteRead = in .read(buffer)) > 0) {
        out.write(buffer, 0, byteRead);
      }
      out.close();
      return out.toByteArray();
    } finally {
      connection.disconnect();
    }
  }
  public String getUrlString(String urlBase) throws IOException, JSONException {
    return new String(getUrlBytes(urlBase));
  }
  public void ShopItems() {
    String jsonString;
    try {
      String url = Uri.parse("https://api.flickr.com/services/rest/")
        .buildUpon()
        .appendQueryParameter("method", "flickr.photos.getRecent")
        .appendQueryParameter("api_key", API_KEY)
        .appendQueryParameter("format", "json")
        .appendQueryParameter("nojsoncallback", "1")
        .appendQueryParameter("extras", "url_s")
        .build().toString();
      jsonString = getUrlString(url);
      Log.i(TAG, "Received JSON: " + jsonString);
      jsonObject = new JSONObject(jsonString);
    } catch (JSONException e) {
      e.printStackTrace();
    } catch (IOException io) {
      Log.e(TAG, "Failed to get items", io);
    }
  }
  JSONObject goodsJSONObject;
  public void parseItems(List<Goods> items, JSONObject j) throws IOException, JSONException {
    JSONObject goodsJSONOject = jsonObject.getJSONObject("photos");
    JSONArray goodsJSONArray = goodsJSONOject.getJSONArray("photo");
    for (int i = 0; i < goodsJSONArray.length(); i++) {
      goodsJSONObject = goodsJSONArray.getJSONObject(i);
    }
  }
  public ContentValues addGood(Goods g) throws IOException, JSONException {
    ContentValues values = new ContentValues();
    List<Goods> items = new ArrayList<>();
    parseItems(items, jsonObject);
    values.put(ShopDbSchema.ShopTable.columnShop.TITLEOFGOODS, goodsJSONObject.getString("title"));
    mSQLiteDatabase.insert(ShopDbSchema.ShopTable.NAME, null, values);
    return values;
  }
}

Но на

JSONObject goodsJSONOject = jsonObject.getJSONObject("photos"); 

выдает

java.lang.NullPointerException: Attempt to invoke virtual method 'org.json.JSONObject org.json.JSONObject.getJSONObject(java.lang.String)' on a null object reference

Сами данные с сайта приложение получает - в логе видно.

Полный текст ошибки в логе

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.bignerdranch.android.shopbaseapi, PID: 17664 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bignerdranch.android.shopbaseapi/com.bignerdranch.android.shopbaseapi.MainActivity2}: java.lang.NullPointerException: Attempt to invoke virtual method 'org.json.JSONObject org.json.JSONObject.getJSONObject(java.lang.String)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'org.json.JSONObject org.json.JSONObject.getJSONObject(java.lang.String)' on a null object reference at com.bignerdranch.android.shopbaseapi.BaseFromAPI.parseItems(BaseFromAPI.java:101) at com.bignerdranch.android.shopbaseapi.BaseFromAPI.addGood(BaseFromAPI.java:114) at com.bignerdranch.android.shopbaseapi.ArrayOfGoods.(ArrayOfGoods.java:66) at com.bignerdranch.android.shopbaseapi.MainActivity2.onCreate(MainActivity2.java:35) at android.app.Activity.performCreate(Activity.java:6662) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)

Answer 1

Наверно надо как-то вызвать ShopItems() предварительно. Потому, что jsonObject не инициализирован при вызове parseItems() и это вызывает java.lang.NullPointerException.

ShopItems();
parseItems(items, jsonObject);
READ ALSO
Уведомление которое нельзя убрать

Уведомление которое нельзя убрать

Всем приветДопустим создаю уведомление обычное в сервисе с помощью NotificationCompat

212
ServerSocket на Heroku

ServerSocket на Heroku

Проблема заключается в том, что я не могу подключиться к серверному сокету на хероку

194
Square root of BigDecimal

Square root of BigDecimal

Я искал решение квадратного корня для BigDecimal и нашел 2 вариантаВыполнил несколько тестов для обоих, они работают с 10 000 точностью

204
Перевод секунд в дату от рождества Хр

Перевод секунд в дату от рождества Хр

Подскажите пожалуйста, как в java перевести строку 63672393600 в дату, чтобы не придумывать велосипед?

197