Vol.Error NullPointerException on String.length()

时间:2018-09-19 09:28:21

标签: android listview nullpointerexception android-volley

我无法找到解决该难题的现有解决方案。这里是: 我有一个齐射要求,它填充了片段中的某些字段。有时,这就是问题所在(并非总是发生),由于“ 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);
}

这是logcat:

09-19 08:49:23.242 21225-21253/? E/Volley: [523] NetworkDispatcher.processRequest: Unhandled exception java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
    at java.net.URLEncoder.encode(URLEncoder.java:204)
    at com.android.volley.Request.encodeParameters(Request.java:491)
    at com.android.volley.Request.getBody(Request.java:477)
    at com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:245)
    at com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:219)
    at com.android.volley.toolbox.HurlStack.executeRequest(HurlStack.java:97)
    at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:131)
    at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:120)
    at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:87)
09-19 08:49:23.298 1882-1896/system_process E/memtrack: Couldn't load memtrack module

请记住,如果我回到主要活动然后重新打开该片段,则一切正常。我认为这可能是服务器延迟的问题,但是如何解决呢?

谢谢大家。所以让我更新:

关于响应

这是我的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);
?>

这是我的答复

[{"mezzo":"Skate","timestamp":"2018-07-15 16:37:00","casa_lavoro":1,"lavoro_casa":0,"punti_passaggio":55},{"mezzo":"Bici","timestamp":"2018-07-20 10:14:03","casa_lavoro":0,"lavoro_casa":1,"punti_passaggio":50},{"mezzo":"Skate","timestamp":"2018-07-25 17:30:00","casa_lavoro":0,"lavoro_casa":1,"punti_passaggio":60},{"mezzo":"Carpooling","timestamp":"2018-09-12 22:38:34","casa_lavoro":1,"lavoro_casa":0,"punti_passaggio":20},{"mezzo":"A Piedi","timestamp":"2018-09-17 10:24:17","casa_lavoro":1,"lavoro_casa":0,"punti_passaggio":90},{"mezzo":"A Piedi","timestamp":"2018-09-17 10:24:36","casa_lavoro":0,"lavoro_casa":1,"punti_passaggio":90}]

服务器端,一切正常。

关于调试

    try {
DP      JSONArray jsonFormHeader = new JSONArray(response);
        for (int i = 0; i < jsonFormHeader.length(); i++) { ...

在JSON转换中设置调试点,我注意到如果引发异常,调试将不会开始。显然这无济于事。

此外,我尝试在onResponse方法启动后立即添加此if语句,但也没有帮助。

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++) { ...

KEY_EMAIL

这是一个通过SharedPreferences导入的字符串,很好,它只是一个电子邮件地址,总是填充。

排球请求

请求以单例模式发送

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

在请求方法中:SingletonVolley.getInstance(getActivity().getApplicationContext()).addToRequestQueue(stringRequest);

这是php网址

  

私有静态字符串FORMBODY_PHP =“ http://towmyride.000webhostapp.com/php/form_body.php”;

我想这与代码本身(如变量)无关,但与上下文有关。我在片段onViewCreated方法中调用此方法,对吗?

3 个答案:

答案 0 :(得分:0)

您应该在获取字符串值之前以及在将其转换为int之前添加检查,

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

答案 1 :(得分:0)

问题出在JSON响应

您的JSON响应为空。我认为可能是这两行出现了问题。

String rawPunti = jsonObject1.getString("punti_passaggio");
int punti = Integer.parseInt(rawPunti);

您的rawPunti值为null,这就是为什么Integer解析得到NullPointerException的原因。

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

仅用于您的最后声明

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

答案 2 :(得分:0)

已解决

最终,我想出了一个解决方案。 问题出在我的Volley getParams()方法的KEY_EMAIL参数中,正如你们中的某些人所建议的那样。 有时处理片段可能会有些棘手。 KEY_EMAIL参数是由Bundle从另一个片段导入的,而我是在目标片段的onStart()方法中导入它的。 所以我直接在getParams()方法中从onStart()导入了导入,现在一切正常。

总结:

  1. Volley错误-如果为null,则在Response上引发Null指针异常。

  2. 数字1原因响应可能为空是由于getParams()中的参数为空。 就我而言,我可以使用以下方法解决该问题:

  

Log.v(“ PARAMS”,params.toString());

即使我无法进行调试。

希望可以帮助某人。谢谢大家。