【问题标题】:Android Volley request throwing Null Pointer ExceptionAndroid Volley 请求抛出空指针异常
【发布时间】:2017-06-13 04:38:19
【问题描述】:

很长一段时间以来,我一直在使用 Android Volley 库在我的服务器中执行对 PHP 脚本的请求。现在,当我这样做时,我遇到了一个不寻常的错误。

我调用脚本的Android代码如下:

 private void writeDatatoDB(){

    StringRequest sr = new StringRequest(Request.Method.POST,URL , new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            Toast.makeText(getApplicationContext(), response.toString(), Toast.LENGTH_SHORT).show();
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(getApplicationContext(),error.toString(),Toast.LENGTH_SHORT).show();
        }
    }){
        @Override
        protected Map<String, String> getParams() throws AuthFailureError {
            HashMap<String,String> maps = new HashMap<>();
            maps.put(SinchHolders.phpUserName,uName);
            maps.put(SinchHolders.phpUserNickName,uNick);
            maps.put(SinchHolders.phpUserPassword,uPass);
            maps.put(SinchHolders.phpUserFirebaseToken,uFCM);
            maps.put(SinchHolders.phpUserProfession,uUserProf);
            maps.put(SinchHolders.phpUserexpertise,uUserExp);
            maps.put(SinchHolders.phpUserGender,ugender);
            maps.put(SinchHolders.phpUserZip,uZip);
            maps.put(SinchHolders.phpUserBirthYear,uBirth);
            return maps;

        }
    };
    RequestQueue rq = Volley.newRequestQueue(dummy_signup_2.this);
    rq.add(sr);
}

Volley库的PHP脚本如下:

<?php
    if( $_SERVER['REQUEST_METHOD'] == 'POST' ){
        $id = $_POST['UserName'];
        $nick =$_POST['NickName'];
        $pass =$_POST['UserPassword'];
        $FirebaseToken = $_POST['FireBaseId'];
        $BDate = $_POST['bithdate'];
        $ZCode = $_POST['zipcode'];
        $Gender = $_POST['sex'];
        $UserProfession = $_POST['userprofession'];
        $userexpert = $_POST['userexpertise'];
        $sql="insert into `User`(`UserNickName`, `UserName`, `password`, `createDate`, `FirebaseToken`, `BirthYear`, `ZipCode`, `Gender`, `UserProfession`, `UserExpertise`) values ('$nick','$id','$pass',Default,'$FirebaseToken','$BDate','$ZCode','$Gender','$UserProfession','$UserExpertise')";
        require_once('db_connect_me.php');
        if(mysqli_query($con,$sql)){
            echo"Success";
        }
        else{
            echo "Failure";
        }
        mysqli_close($con);
    }else{
        echo "Error";
    }
    ?>

Volley 向我抛出的错误是com.android.volley.VolleyError: Java.Lang.NullPointerException。该错误是由服务器端的一些错误引起的,因为该错误显示在 ErrorListener 中定义的 toast 中。我不明白问题可能是什么。我创建了一个简单的 helloworld php 文件并使用相同的代码调用它,我能够获得输出。这可能有什么问题?

堆栈跟踪:

01-27 19:11:41.715 12548-16431/com.example.****.****E/Volley: [2720] NetworkDispatcher.run: Unhandled exception java.lang.NullPointerException
                                                                         java.lang.NullPointerException
                                                                             at libcore.net.UriCodec.encode(UriCodec.java:132)
                                                                             at java.net.URLEncoder.encode(URLEncoder.java:57)
                                                                             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)

PS:请仔细阅读问题,您会明白这与本网站中的任何NullPointerException 问题均不重复。

【问题讨论】:

  • 哪一行抛出NullPointerException?
  • @adalPaRi 脚本的响应是抛出异常。 ErrorListener 中给出的 toast 正在引发该异常。
  • 你php代码我导致SQL注入,请使用mysqli_real_escape_string
  • @Anton 是的,我会改变它,但我不认为这可能是错误的原因吗?
  • @W4R10CK 我认为情况并非如此,我正在使用 SharedPreferences 检索我的所有参数。因此,即使找不到该值,参数也会采用默认值(也是一个字符串)。

标签: java php android android-volley


【解决方案1】:

当params 的任何一个值为空时,您将得到这个exception。检查params中的值参数

 @Override
    protected Map<String, String> getParams() throws AuthFailureError {
        //put your map keys
        return checkParams(params);
    }

 private Map<String, String> checkParams(Map<String, String> map){               
        Iterator<Entry<String, String>> it = map.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<String, String> pairs = (Map.Entry<String, String>)it.next();
            if(pairs.getValue()==null){
                map.put(pairs.getKey(), "");
            }
        }
        return map;             
    }

【讨论】:

    【解决方案2】:

    NullPointException 是由您绑定到数据库中的一个值引起的,并且没有从用户那里获得价值。缺少-createDate:

    进入 DB 的参数为 10:

    `UserNickName`, `UserName`, `password`, `createDate`, `FirebaseToken`, `BirthYear`, `ZipCode`, `Gender`, `UserProfession`, `UserExpertise`
    

    您错过了以下输入值:

    `createDate`
    

    仅来自用户 9:

    maps.put(SinchHolders.phpUserName,uName);
    maps.put(SinchHolders.phpUserNickName,uNick);
    maps.put(SinchHolders.phpUserPassword,uPass);
    maps.put(SinchHolders.phpUserFirebaseToken,uFCM);
    maps.put(SinchHolders.phpUserProfession,uUserProf);
    maps.put(SinchHolders.phpUserexpertise,uUserExp);
    maps.put(SinchHolders.phpUserGender,ugender);
    maps.put(SinchHolders.phpUserZip,uZip);
    maps.put(SinchHolders.phpUserBirthYear,uBirth);
    

    【讨论】:

    • createDate 的默认值是SERVER_TIMESTAMP
    • 但是有一个选项可以让您将默认设置为时间戳,当我从 PHPMyAdmin 中的 SQL 查询框执行查询时,它可以正常工作。
    • 另外,我认为您对将 null 作为参数之一发送的建议是正确的。我对所有值进行了硬编码,现在我能够发送成功的请求,并且数据正在输入到数据库中。我正在一一检查所有值以确定其中哪些为空
    猜你喜欢
    • 2014-10-31
    • 2013-03-27
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    • 2020-11-22
    • 2020-08-10
    • 2013-03-21
    相关资源
    最近更新 更多