获取java.lang.NullPointerException:println需要一条消息

时间:2018-05-29 01:26:03

标签: java android nullpointerexception

当我通过之前调用的其他方法访问变量时,我得到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中从服务器获取数据的值。

2 个答案:

答案 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