Получение java.lang.NullPointerException: println требуется сообщение

Я получаю исключение нулевого указателя, когда обращаюсь к переменной, установленной другим методом, вызванным ранее.

import android.util.Log;
public class StartActivity extends AppCompatActivity {

String lat, longi;
String soil_depth_db,soil_type_db,lulc_type_db,district_db;
String slope_db;
@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    lat = getIntent().getExtras().get("Latitude").toString();
    longi = getIntent().getExtras().get("Longitude").toString();

    getData(lat, longi);

    setData();
  }

private void setData(){
    Log.d("index",slope_db);
}


private void  getData(String lat, String longi){
    String URL = "http://10.129.133.157/test.php?x = "+longi+"&y = "+lat;
    Log.d("URL",URL);
    StringRequest stringRequest = new StringRequest(com.android.volley.Request.Method.GET, URL,
            new com.android.volley.Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        Log.d("JSON",response);
                        JSONObject jsonObj = new JSONObject(response);
                        if (jsonObj.get("slope").equals(null))
                            slope_db = "1.0" ;
                        else
                            slope_db = (String) jsonObj.get("slope");
                        Log.d("slope",slope_db);


                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            },
            new com.android.volley.Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d("TAG error","error occured"+error.toString());
                }
            }
    );
    stringRequest.setRetryPolicy(new DefaultRetryPolicy(100000000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);



}

Когда я комментирую строку Log.d("index",slope_db); в setData (), она работает нормально, иначе выдает ошибку NullPointer. Таким образом, значение, установленное в gatData, которое принимает данные с сервера, не используется функцией SetData ().

Как заявлен Log?

Iłya Bursov 29.05.2018 03:28

slope_db имеет значение null ...?

ImGeorge 29.05.2018 03:30

Похоже, ваш slope_db назначен в обработчике асинхронного ответа. Это происходит после того, как вы позвоните в setData(). Вы должны правильно реализовать асинхронный обмен сообщениями - подождите, пока не решится будущее.

Michal 29.05.2018 03:31

slope_db устанавливается в getData (), но при доступе к SetData () он равен нулю, хотя он не должен быть нулевым.

sudhanshud 29.05.2018 03:34

@sudhanshud Попробуйте добавить 2 секунды сна между getData() и setData() - вы должны увидеть, что slope_db внезапно заполняется. Пожалуйста, не используйте сон в вашем реальном решении - вместо этого правильно реализуйте асинхронную обработку.

Michal 29.05.2018 03:38

Спасибо @Michal.

sudhanshud 29.05.2018 04:59

Кто проголосовал против, укажите причины.

sudhanshud 29.05.2018 05:02

вы используете slope_db перед тем, как что-либо записывать на него, поэтому он пуст.

Vladyslav Matviienko 29.05.2018 08:01

Возможный дубликат Что такое исключение NullPointerException и как его исправить?

Vladyslav Matviienko 29.05.2018 08:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
9
222
2

Ответы 2

Залп выполняется асинхронно. slope_db не устанавливается до первого завершения строкового запроса. getData() завершается до установки slope_db, а setData() выполняется сразу после завершения getData(). Не полагайтесь на асинхронные вызовы для инициализации данных, которые вам понадобятся в основном потоке, нет гарантии, что данные будут инициализированы до того, как они вам понадобятся.

Либо инициализируйте поле slope_db (например, String slope_db = "";), либо не используйте slope_db до тех пор, пока не убедитесь, что оно было инициализировано асинхронным вызовом.

Строка является объектом в Java, поэтому, если вы попытаетесь напечатать «неинициализированную строку», программа выполнит NullPointerException.

Когда происходит событие onCreate(), slope_db имеет значение null.

Вот пример

String test;
System.out.println(test); //Complie error because not initialized

test = "";
System.out.println(test); //Ok

Другие вопросы по теме