【发布时间】: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