неожиданное исключение IndexOutOfBoundsException в вызове дооснащения - PullRequest
0 голосов
/ 07 июля 2019

Я делаю простой вызов Google Map API с Retrofit в моем приложении Я вижу ошибку в консоли GooglePlay и на одном из моих телефонов, но не могу воспроизвести ошибку с помощью эмулятора и других моих телефонов - все просто работает нормально. Это java.lang.IndexOutOfBoundsException

Похоже, ошибка появляется, только если приложение остается нетронутым несколько дней или недель. И PlayConsole говорит, что проблема не появляется в версии Android ниже, чем 7.0

Пожалуйста, покажите код ниже Stacktrace указывает на ошибку в строке при запуске цикла try-catch. Я предположил, что у меня просто ошибка, потому что я пытался "получить (0)", когда нет данных в ответ. Но я воспроизвел это поведение, и мой блок «catch» сработал отлично, приложение не вылетало

И в конце концов, почему трассировка стека указывает строку 76, а не строку 77, где произошел фактический вызов?

Вот метод с ошибкой

    Call<Geocod> response = geocoding_interfaces.CoordinatesFactory.getInstance().getCoordinates(coordinates, private_key);

        try {      //HERE IS STRING 76 
            incomelocation = response.execute().body().getResults().get(0).getGeometry().getLocation();
            askinglocation = from_loc_to_string(incomelocation);
        } catch (IOException | IndexOutOfBoundsException e) {
            askinglocation = locations;
        }

Вот обратный звонок

   @Override
        public void onLoadFinished( Loader<List<Datum>> loader, List<Datum> data) {
            int id = loader.getId();
            if (id == R.id.weather_loader_id) {
                if (data != null) {
                      // here some methods to work with data
                } else
                {
                     // here some methods to work errors out 
                }

вот основной интерфейс Retrofit

import android.support.annotation.NonNull;
import android.util.Log;

import java.util.concurrent.TimeUnit;

import dev.eyesless.simple_weather_for_fishermans.BuildConfig;
import dev.eyesless.simple_weather_for_fishermans.geocoding_responce_classes.Geocod;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Call;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.http.GET;
import retrofit2.http.Query;

public interface geocoding_interfaces {

    String BASE_URL = "https://maps.googleapis.com/maps/api/";

    @GET("geocode/json")
    Call<Geocod> getCoordinates(@Query("address") String order, @Query("key") String key);

    class CoordinatesFactory {

        private static geocoding_interfaces service;

        public static geocoding_interfaces getInstance() {

            if (service == null) {

                HttpLoggingInterceptor logging = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
                    @Override public void log(@NonNull String message) {
                        Log.e("MY_TAG", "OkHttp: " + message);
                    }
                });

                logging.setLevel(BuildConfig.DEBUG ? HttpLoggingInterceptor.Level.BASIC : HttpLoggingInterceptor.Level.NONE);

                OkHttpClient client = new OkHttpClient.Builder()
                        .addInterceptor(logging) // TODO: 15.10.2017 remoove before production
                        .retryOnConnectionFailure(false)
                        .connectTimeout(5, TimeUnit.SECONDS)
                        .readTimeout(1, TimeUnit.SECONDS)
                        .build();

                Retrofit retrofit = new Retrofit.Builder()
                        .baseUrl(BASE_URL)
                        .addConverterFactory(GsonConverterFactory.create())
                        .client(client)
                        .build();

                service = retrofit.create(geocoding_interfaces.class);

                return service;
            }

            else {
                return service;
            }
        }
    }
}

StackTrace:

java.lang.RuntimeException: 
  at android.support.v4.content.ModernAsyncTask$3.done (ModernAsyncTask.java:161)
  at java.util.concurrent.FutureTask.finishCompletion (FutureTask.java:383)
  at java.util.concurrent.FutureTask.setException (FutureTask.java:252)
  at java.util.concurrent.FutureTask.run (FutureTask.java:271)
  at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1162)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:636)
  at java.lang.Thread.run (Thread.java:784)
Caused by: java.lang.IndexOutOfBoundsException: 
  at java.util.ArrayList.get (ArrayList.java:437)
  at dev.eyesless.simple_weather_for_fishermans.repository.WeatherLoader.loadInBackground (WeatherLoader.java:76)
  at dev.eyesless.simple_weather_for_fishermans.repository.WeatherLoader.loadInBackground (WeatherLoader.java:21)
  at android.support.v4.content.AsyncTaskLoader.onLoadInBackground (AsyncTaskLoader.java:302)
  at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground (AsyncTaskLoader.java:57)
  at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground (AsyncTaskLoader.java:45)
  at android.support.v4.content.ModernAsyncTask$2.call (ModernAsyncTask.java:138)
  at java.util.concurrent.FutureTask.run (FutureTask.java:266)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...