【问题标题】:Null Pointer Exception when sending persistent data via Volley通过 Volley 发送持久数据时出现空指针异常
【发布时间】:2017-10-01 22:06:56
【问题描述】:

我正在使用 Volley 将当前存储在 SharedPreferences 中的信息发送到远程 mysql 数据库。调用 addDataToDB() 方法时出现 NullPointer 异常。测试这些值是否存在并且它们确实存在(使用日志打印输出)。无法理解为什么我会收到空​​指针异常。

在下面添加了相关代码。

用于向远程服务器发送信息的方法:

private void addDataToDB(){

    username = preferences.getString("username", null);
    firstname = preferences.getString("firstname", null);
    lastname = preferences.getString("lastname", null);
    Log.d("TAG", "addDataToDB: " + username + firstname + lastname); //Getting correct name print outs

    Response.Listener<String> responseListener = new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            //not reaching here
            try {
                JSONObject jsonResponse = new JSONObject(response);
                boolean success = jsonResponse.getBoolean("success");
                if (success) {
                    Toast.makeText(MainActivity.this, "All data added", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(MainActivity.this, "Data not added!", Toast.LENGTH_SHORT).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    };

    RegisterRequestAll registerRequestAll = new RegisterRequestAll(
            username, firstname, lastname, responseListener);
    RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
    queue.add(registerRequestAll);
} 

RegisterRequestAll 类:

class RegisterRequestAll extends StringRequest{
    private static final String REGISTER_REQUEST_URL = "register.php";
    private Map<String, String> params;

    RegisterRequestAll(
            String username, String firstname, String lastname, Response.Listener<String> listener) {
        super(Method.POST, REGISTER_REQUEST_URL, listener, null);
        params = new HashMap<>();
        params.put("username", username);
        params.put("firstname", firstname);
        params.put("lastname", lastname);
    }

    @Override
    public Map<String, String> getParams() {
        return params;
    }
}

注册.php:

<?php

    require("connect.php"); // working file which connects to database

    $username = $_POST["username"];
    $firstname = $_POST["firstname"];
    $lastname = $_POST["lastname"];

    $response = array();
    $response["success"] = false;  

     function registerUser() {
        global $connection, $username, $firstname, $lastname, $response;

        $sql = "UPDATE user SET firstname=?, lastname=? WHERE username=?";
        if($stmt = mysqli_prepare($connection, $sql)){
            mysqli_stmt_bind_param($stmt, "sss", $firstname, $lastname, $username);
            mysqli_stmt_execute($stmt);
        } 
        mysqli_stmt_close($stmt);
        mysqli_close($connection);
        $response["success"] = true;  
    }   

    registerUser();
    echo json_encode($response);

例外:

[263] NetworkDispatcher.run: 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:450)
                                                                            at com.android.volley.Request.getBody(Request.java:436)
                                                                            at com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:260)
                                                                            at com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:234)
                                                                            at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:107)
                                                                            at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:96)
                                                                            at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:112)

【问题讨论】:

    标签: android mysql android-volley


    【解决方案1】:

    这通常发生在您发布空字符串时

    params.put("username", username);
    params.put("firstname", firstname);
    params.put("lastname", lastname);
    

    一个(或多个)用户名和...为空;

    【讨论】:

    • 如上所述,在打印输出上测试,我传入的值存在。
    • 只能是你的url或者参数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 2013-10-29
    • 2014-10-31
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多