Получение java.lang.NullPointerException: println нужно сообщение - PullRequest
0 голосов
/ 29 мая 2018

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

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 ().

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

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

Когда произойдет событие onCreate(), slope_db равно нулю.

Вот пример

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

test = "";
System.out.println(test); //Ok
0 голосов
/ 29 мая 2018

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...