Почему я получаю исключение NullPointerException в HttpURLConnection - PullRequest
0 голосов
/ 02 марта 2020

Я разрабатываю приложение Android, которое использует запрос GET для получения списка фильтров в ответе JSON. Эта часть приложения работала с момента его первой реализации до недавнего времени. Я работал над другими частями проекта, когда заметил, что запуск приложения и открытие действия, которое извлекает фильтры, перестало работать и приведет к исключению, несмотря на то, что эта часть проекта не была затронута какими-либо прямыми изменениями кода ,

У меня есть активность, которая вызывает сервер и получает список фильтров: FindMeARestaurantActivity и имеет AsyncTask с именем GetFiltersTask, который гарантирует, что эта задача не выполняется на уровне пользовательского интерфейса. Я использую DAO с именем restaurantDAO, который выполняет вызов HttpURLConnection. Именно в этом классе происходит исключение. Когда я отлаживаю и вхожу в restaurantDAO.getFilters(), возникает исключение, когда я пытаюсь перешагнуть через строку connection.connect() и получаю эту ошибку: java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.lang.Iterable.iterator()' on a null object reference. Я понятия не имею, почему это происходит, поскольку я не касался этого кода, конечная точка по-прежнему отправляет ответ JSON (проверено в браузере), и я не знаю, откуда берется это значение null. Вот мой AsyncTask и getFilters() метод в DAO соответственно:

    public class GetFiltersTask extends AsyncTask<String, Integer, List<CheckboxDTO>> {

        @Override
        protected void onPreExecute() {
            pbProgressBar.setVisibility(View.VISIBLE);
            pbProgressBar.setProgress(0);
        }

        @Override
        protected void onProgressUpdate(Integer... integers) {
            pbProgressBar.setProgress(integers[0]);
        }

        @Override
        protected List<CheckboxDTO> doInBackground(String... strings) {
            String serverResponse = restaurantDAO.getFilters();
            try
            {
                // Create JSON Object with contents of server response
                JSONObject jsonResponseObject = new JSONObject(serverResponse);
                // Grab the JSON Array of filters from the JSON Object
                JSONArray jsonResponseArray = jsonResponseObject.getJSONArray("filters");

                // For loop to iterate through each returned filter from server, generate a checkbox for them,
                // then append those to the linear layout
                for (int i = 0; i < jsonResponseArray.length(); i++)
                {
                    // Create CheckboxDTO object
                    CheckboxDTO checkboxDTO = new CheckboxDTO();
                    // Grab JSON Object out of JSON Array
                    JSONObject objects = jsonResponseArray.getJSONObject(i);
                    // Grab the ID and Value from JSON Object
                    int id = objects.getInt("id");
                    String name = objects.getString("name");

                    // Assign JSON Object's key/value pair to CheckboxDTO's private fields
                    checkboxDTO.setId(id);
                    checkboxDTO.setValue(name);

                    // Add the CheckboxDTO to the checkboxes array
                    checkboxes.add(checkboxDTO);
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }

            return checkboxes;
        }

        protected void onPostExecute(List<CheckboxDTO> result) {
            super.onPostExecute(result);
            pbProgressBar.setVisibility(View.GONE);
            makeCheckboxes(result);
        }
    }

И

@Override
    public String getFilters() {
        String inputLine;
        String result;
        try
        {
            // Create URL object to hold URL
            URL filterURL = new URL(filtersURL);
            // Create connection to server
            HttpURLConnection connection = (HttpURLConnection) filterURL.openConnection();

            // Set connection methods and timeouts
            connection.setRequestMethod(FILTERS_REQUEST_METHOD);
            connection.setReadTimeout(READ_TIMEOUT);
            connection.setConnectTimeout(CONNECTION_TIMEOUT);

            // Connect to server
            connection.connect();

            // Create InputStreamReader to read response from server
            InputStreamReader streamReader = new InputStreamReader(connection.getInputStream());

            // Create BufferedReader to read through InputStream
            BufferedReader reader = new BufferedReader(streamReader);
            StringBuilder stringBuilder = new StringBuilder();

            // Check if the line being read is not null
            while ((inputLine = reader.readLine()) != null){
                stringBuilder.append(inputLine);
            }

            // Close out InputStream and BufferedReader
            reader.close();
            streamReader.close();

            // Set result to our inputLine with stringBuilder
            result = stringBuilder.toString();
            connection.disconnect();
        }
        catch (IOException e)
        {
            e.printStackTrace();
            return null;
        }

        return result;
    }

Ошибка трассировки стека:

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
    Process: com.chooseurfood, PID: 4108
    java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:325)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
        at java.util.concurrent.FutureTask.run(FutureTask.java:242)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
        at java.lang.Thread.run(Thread.java:761)
     Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.util.Iterator java.lang.Iterable.iterator()' on a null object reference
        at java.net.CookieManager.get(CookieManager.java:214)
        at com.android.okhttp.internal.http.HttpEngine.networkRequest(HttpEngine.java:714)
        at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:223)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457)
        at com.android.okhttp.internal.huc.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:126)
        at dao.FindMeARestaurantDAO.getFilters(FindMeARestaurantDAO.java:146)
        at com.chooseurfood.ui.FindMeARestaurantActivity$GetFiltersTask.doInBackground(FindMeARestaurantActivity.java:219)
        at com.chooseurfood.ui.FindMeARestaurantActivity$GetFiltersTask.doInBackground(FindMeARestaurantActivity.java:204)
        at android.os.AsyncTask$2.call(AsyncTask.java:305)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
        at java.lang.Thread.run(Thread.java:761) 

Буду признателен за любую помощь в решении этой проблемы.

...