2017-01-27 37 views
1

我一直在使用Android Volley庫在我的服務器上執行PHP腳本的請求很長一段時間。現在,當我這樣做時,我遇到了一個不尋常的錯誤。Android排球請求拋出空指針異常

我的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中定義的烤麪包中顯示。我不明白這個問題可能是什麼。我創建了一個簡單的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問題。

+0

哪一行是拋出* NullPointerException *? – adalPaRi

+0

@adalPaRi腳本的響應拋出異常。 'ErrorListener'中給出的敬酒正在拋出該異常。 – Tyson

+0

你的php代碼我的SQL注入,請使用mysqli_real_escape_string –

回答

2

你會得到這exception,當任何的params價值我s null。檢查你的數值參數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;    
    } 
1

NullPointException是由一個值綁定到DB中,並沒有從用戶獲得價值。缺少 - createDate

PARAMS到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); 
+1

createDate的默認值是'SERVER_TIMESTAMP' – Tyson

+0

'Default'是空的人 – W4R10CK

+1

但是有一個選項可以使默認值爲Timestamp,當我執行查詢時它是完美的PHPMyAdmin中的SQL查詢框。 – Tyson