Я получаю исключение нулевого указателя, когда обращаюсь к переменной, установленной другим методом, вызванным ранее.
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 ().
slope_db имеет значение null ...?
Похоже, ваш slope_db назначен в обработчике асинхронного ответа. Это происходит после того, как вы позвоните в setData(). Вы должны правильно реализовать асинхронный обмен сообщениями - подождите, пока не решится будущее.
slope_db устанавливается в getData (), но при доступе к SetData () он равен нулю, хотя он не должен быть нулевым.
@sudhanshud Попробуйте добавить 2 секунды сна между getData() и setData() - вы должны увидеть, что slope_db внезапно заполняется. Пожалуйста, не используйте сон в вашем реальном решении - вместо этого правильно реализуйте асинхронную обработку.
Спасибо @Michal.
Кто проголосовал против, укажите причины.
вы используете slope_db перед тем, как что-либо записывать на него, поэтому он пуст.
Возможный дубликат Что такое исключение NullPointerException и как его исправить?




Залп выполняется асинхронно. 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
Как заявлен
Log?