Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android String.length()上的截击错误NullPointerException_Android_Listview_Nullpointerexception_Android Volley - Fatal编程技术网

Android String.length()上的截击错误NullPointerException

Android String.length()上的截击错误NullPointerException,android,listview,nullpointerexception,android-volley,Android,Listview,Nullpointerexception,Android Volley,我无法找到一些现有的解决我的神秘问题的办法。这是: 我收到一个截击请求,它填充了我片段中的一些字段。有时,由于“String.length()”方法,它会抛出一个NullPointerException,这就是问题所在(它并不总是发生)。我找不到臭虫在哪里 以下是错误: com.android.volley.VolleyError:java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“int java.lang.String.length()” 这是我的截击

我无法找到一些现有的解决我的神秘问题的办法。这是: 我收到一个截击请求,它填充了我片段中的一些字段。有时,由于“String.length()”方法,它会抛出一个NullPointerException,这就是问题所在(它并不总是发生)。我找不到臭虫在哪里

以下是错误:

com.android.volley.VolleyError:java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“int java.lang.String.length()”

这是我的截击请求:

private void loadFormBody() {
    StringRequest stringRequest = new StringRequest(Request.Method.POST, FORMBODY_PHP, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            try {
                JSONArray jsonFormBody = new JSONArray(response);
                for (int i = 0; i < jsonFormBody.length(); i++) {
                    JSONObject jsonObject1 = jsonFormBody.getJSONObject(i);
                    String mezzo = jsonObject1.getString("mezzo");
                    String casa_lavoro = jsonObject1.getString("casa_lavoro");
                    String lavoro_casa = jsonObject1.getString("lavoro_casa");
                    String rawData = jsonObject1.getString("timestamp");
                    String rawPunti = jsonObject1.getString("punti_passaggio");
                    int punti = Integer.parseInt(rawPunti);
                    if (casa_lavoro.equals("1") && lavoro_casa.equals("0")) {
                        tipoPassaggio = "Casa > Lavoro";
                    } else if (lavoro_casa.equals("1") && casa_lavoro.equals("0")) {
                        tipoPassaggio = "Lavoro > Casa";
                    }
                    try {
                        String[] date = rawData.split("-|:| ");
                        yearPassaggio = date[0];
                        monthPassaggio = date[1];
                        dayPassaggio = date[2];
                        hourPassaggio = date[3];
                        minutePassaggio = date[4];
                        secondPassaggio = date[5];
                        dataPassaggio = dayPassaggio + "/" + monthPassaggio + "/" + yearPassaggio;
                    } catch (ArrayIndexOutOfBoundsException e) {
                        e.printStackTrace();
                    }
                    listTable.add(new ObjUserTable(mezzo, tipoPassaggio, dataPassaggio, punti));
                }
                adapterUserTable = new AdapterUserTable(getContext(), listTable);
                lvUserTable.setAdapter(adapterUserTable);
            } catch (JSONException e) {
                Toast.makeText(getContext(), "Decodifica JSON Fallita: " + e.toString(), Toast.LENGTH_SHORT).show();
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(getContext(), "Popolamento FallitoB: " + error.toString(), Toast.LENGTH_LONG).show();
        }
    }) {
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("email", KEY_EMAIL);
            return params;
        }
    };
    SingletonVolley.getInstance(getActivity().getApplicationContext()).addToRequestQueue(stringRequest);
}
请记住,如果我回到我的主要活动,然后重新打开片段,一切正常。我认为这可能是一个服务器延迟问题,但如何解决呢

谢谢大家。让我更新一下:

关于回应

这是我的php代码

<?php
require('connection.php');
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $email = $_POST['email'];
    $sql = "SELECT mezzo, timestamp, casa_lavoro, lavoro_casa, punti_passaggio FROM passaggi WHERE email_userdata='$email'";
    if ($stmt = mysqli_prepare($conn, $sql)) {
        mysqli_stmt_execute($stmt);
        $userstable = mysqli_stmt_get_result($stmt);
        $json = mysqli_fetch_all($userstable, MYSQLI_ASSOC);
        echo json_encode($json);
    }
    mysqli_stmt_free_result($stmt);
    mysqli_stmt_close($stmt);
} else {
    echo "Error";
}
mysqli_close($conn);
?>
服务器端,一切正常

关于调试

    try {
DP      JSONArray jsonFormHeader = new JSONArray(response);
        for (int i = 0; i < jsonFormHeader.length(); i++) { ...
在请求方法中:
SingletonVolley.getInstance(getActivity().getApplicationContext()).addToRequestQueue(stringRequest)

这是php的url

私有静态字符串FORMBODY_PHP=“”


我想它并不像变量那样关注代码本身,但它与上下文有关。我在一个片段onViewCreated方法中调用这个方法,对吗?

在获取字符串值和像这样转换为int之前,应该添加check

 if (object.has("punti_passaggio") && !object.isNull("punti_passaggio")) {
String rawPunti = jsonObject1.getString("punti_passaggio");
} // this check is important because sometimes data from json is null or sometimes this json tag don't exist
if(rawPunti.length() != 0){
int punti = Integer.parseInt(rawPunti);
}

问题在JSON响应中

您的JSON响应为空。我认为问题可能发生在这两条线上

String rawPunti = jsonObject1.getString("punti_passaggio");
int punti = Integer.parseInt(rawPunti);
您的rawPunti值为null,这就是整数解析得到NullPointerException的原因

因此,为了进行调试,您应该为JSON响应添加一个logcat。然后正确地准备JsonResponse。我认为如果您的响应是有效的JSON,那么您的代码就可以了

仅适用于您的最后陈述


您最后提到您正在使用片段。但是没有代码。因此,请确保您的片段是否在服务器数据初始化为片段之后初始化。在这种情况下,您可以第一次获得
NullPointerException
。但这一例外与此无关。

已解决

最后,我想出了一个解决办法。 问题出在我的KEY_EMAIL param in Volley getParams()方法中,正如你们中的一些人推荐的那样。 有时处理碎片可能有点棘手。KEY_EMAIL参数是由Bundle从另一个片段导入的,我在目标片段的onStart()方法中导入它。 因此,我在getParams()方法中直接从onStart()移动了导入,现在一切正常

总而言之:

  • 截击错误-响应为空时引发空指针异常

  • 响应可能为null的第1个原因是getParams()中的参数为null。 就我而言,我能够通过以下方式解决问题:

  • Log.v(“PARAMS”,PARAMS.toString())

    即使我无法处理调试


    希望能帮助别人。谢谢大家。

    可能是您的
    响应
    有时会显示,因为响应需要时间,并且取决于网络。for(int i=0;i密钥\u电子邮件有什么价值?看起来问题在于生成截击请求。请确保您已经正确地定义了url FORMBODY_PHP。只需交叉验证是否已正确初始化FORMBODY_PHP和KEY_电子邮件。如果是,请共享这两个值。
    public void onResponse(String response) {
        if (response != null && response.length() > 0) {
            try {
                JSONArray jsonFormHeader = new JSONArray(response);
                for (int i = 0; i < jsonFormHeader.length(); i++) { ...
    
    import android.content.Context;
    import com.android.volley.Request;
    import com.android.volley.RequestQueue;
    import com.android.volley.toolbox.Volley;
    
    public class SingletonVolley {
    
        private static SingletonVolley mInstance;
        private static Context mCtx;
        private RequestQueue requestQueue;
    
        private SingletonVolley(Context context) {
            mCtx = context;
            requestQueue = getRequestQueue();
        }
    
        public static synchronized SingletonVolley getInstance(Context context) {
            if (mInstance == null) {
                mInstance = new SingletonVolley(context);
            }
            return mInstance;
        }
    
        public RequestQueue getRequestQueue() {
            if (requestQueue == null) {
                requestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
            }
            return requestQueue;
        }
    
        public void addToRequestQueue(Request request) {
            getRequestQueue().add(request);
        }
    }
    
     if (object.has("punti_passaggio") && !object.isNull("punti_passaggio")) {
    String rawPunti = jsonObject1.getString("punti_passaggio");
    } // this check is important because sometimes data from json is null or sometimes this json tag don't exist
    if(rawPunti.length() != 0){
    int punti = Integer.parseInt(rawPunti);
    }
    
    String rawPunti = jsonObject1.getString("punti_passaggio");
    int punti = Integer.parseInt(rawPunti);