【问题标题】:Getting java.lang.NullPointerException: println needs a message获取 java.lang.NullPointerException: println 需要一条消息
【发布时间】:2018-05-29 01:26:02
【问题描述】:

当我访问由之前调用的其他方法设置的变量时,出现空指针异常。

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);



}

当我在 setData() 中注释行 Log.d("index",slope_db); 时,它可以正常工作,否则会给出 NullPointer 错误。因此,从服务器获取数据的 gatData 中设置的值不会被 SetData() 函数访问。

【问题讨论】:

  • Log 是如何声明的?
  • slope_db 为空...?
  • 看起来您的 slope_db 是在异步响应处理程序中分配的。这发生在您致电setData() 之后。您应该正确实现异步消息传递 - 等待未来解决。
  • 谁投了反对票,请说明理由。

标签: java android nullpointerexception


【解决方案1】:

Volley 正在异步执行。 slope_db 在第一次完成字符串请求之前没有设置。 getData()slope_db 设置之前完成,setData()getData() 完成后立即执行。不要依赖异步调用来初始化你在主线程上需要的数据,永远不能保证数据会在你需要它之​​前被初始化。

要么初始化slope_db 字段(例如String slope_db = "";),要么在确定它已被异步调用初始化之前不要使用slope_db

【讨论】:

    【解决方案2】:

    字符串在Java中是一个对象,所以如果你尝试打印“未初始化的字符串”,程序会出现NullPointerException

    onCreate()事件发生时,slope_db为空。

    这是一个例子

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-01
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多