当我通过之前调用的其他方法访问变量时,我得到Null指针异常。
jQuery(document).ready(function($) {
$( "#services .box li" ).each(function( index ) { //for each relevant LI on the page...
//if not the first LI / not containing a <button>, then...
var one_id = $(this).text();
one_id = one_id.replace(/[^a-zA-Z0-9]/g,'-');
$(this).attr('id', one_id);
});
})
当我在setData()中对行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);
}
进行注释时,它可以正常工作,否则会产生NullPointer错误。因此,SetData()函数不会访问gatData中从服务器获取数据的值。
答案 0 :(得分:0)
Volley异步执行。在第一次完成String请求之前,未设置slope_db
。设置getData()
之前slope_db
完成,setData()
完成后立即执行getData()
。不要依赖异步调用来初始化主线程上需要的数据,从来不保证数据会在您需要之前进行初始化。
初始化slope_db
字段(例如String slope_db = "";
),或者在确定异步调用已初始化之后才使用slope_db
。
答案 1 :(得分:0)
字符串是Java中的对象,因此如果您尝试打印“未初始化的字符串”,程序将出现NullPointerException
。
发生 onCreate()
事件时, slope_db
为空。
以下是示例
String test;
System.out.println(test); //Complie error because not initialized
test = "";
System.out.println(test); //Ok