Android String.length()上的截击错误NullPointerException
我无法找到一些现有的解决我的神秘问题的办法。这是: 我收到一个截击请求,它填充了我片段中的一些字段。有时,由于“String.length()”方法,它会抛出一个NullPointerException,这就是问题所在(它并不总是发生)。我找不到臭虫在哪里 以下是错误: com.android.volley.VolleyError:java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“int java.lang.String.length()” 这是我的截击请求:Android String.length()上的截击错误NullPointerException,android,listview,nullpointerexception,android-volley,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);
}
请记住,如果我回到我的主要活动,然后重新打开片段,一切正常。我认为这可能是一个服务器延迟问题,但如何解决呢
谢谢大家。让我更新一下:
关于回应
这是我的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);
?>
服务器端,一切正常
关于调试
try {
DP JSONArray jsonFormHeader = new JSONArray(response);
for (int i = 0; i < jsonFormHeader.length(); i++) { ...
在请求方法中:SingletonVolley.getInstance(getActivity().getApplicationContext()).addToRequestQueue(stringRequest)代码>
这是php的url
私有静态字符串FORMBODY_PHP=“”
我想它并不像变量那样关注代码本身,但它与上下文有关。我在一个片段onViewCreated方法中调用这个方法,对吗?在获取字符串值和像这样转换为int之前,应该添加check
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);
}
问题在JSON响应中
您的JSON响应为空。我认为问题可能发生在这两条线上
String rawPunti = jsonObject1.getString("punti_passaggio");
int punti = Integer.parseInt(rawPunti);
您的rawPunti值为null,这就是整数解析得到NullPointerException的原因
因此,为了进行调试,您应该为JSON响应添加一个logcat。然后正确地准备JsonResponse。我认为如果您的响应是有效的JSON,那么您的代码就可以了
仅适用于您的最后陈述
您最后提到您正在使用片段。但是没有代码。因此,请确保您的片段是否在服务器数据初始化为片段之后初始化。在这种情况下,您可以第一次获得NullPointerException
。但这一例外与此无关。已解决
最后,我想出了一个解决办法。
问题出在我的KEY_EMAIL param in Volley getParams()方法中,正如你们中的一些人推荐的那样。
有时处理碎片可能有点棘手。KEY_EMAIL参数是由Bundle从另一个片段导入的,我在目标片段的onStart()方法中导入它。
因此,我在getParams()方法中直接从onStart()移动了导入,现在一切正常
总而言之:
截击错误-响应为空时引发空指针异常
响应可能为null的第1个原因是getParams()中的参数为null。
就我而言,我能够通过以下方式解决问题:
Log.v(“PARAMS”,PARAMS.toString())
即使我无法处理调试
希望能帮助别人。谢谢大家。可能是您的响应
为空
有时会显示,因为响应需要时间,并且取决于网络。for(int i=0;i密钥\u电子邮件有什么价值?看起来问题在于生成截击请求。请确保您已经正确地定义了url FORMBODY_PHP。只需交叉验证是否已正确初始化FORMBODY_PHP和KEY_电子邮件。如果是,请共享这两个值。
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++) { ...
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);
}
}
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);
}
String rawPunti = jsonObject1.getString("punti_passaggio");
int punti = Integer.parseInt(rawPunti);