onPostExecute中for循环未执行,无法存储服务器JSON数据至数组
从你的描述和代码来看,执行JSONArray departamenteArray = obj.getJSONArray("departamente");后后续代码没运行,大概率是以下几个原因之一,咱们一步步排查:
1. 集合未初始化导致空指针异常
你的id_departamente和departamente这两个集合如果在使用前没有初始化(比如只是声明了List<String> id_departamente;但没做id_departamente = new ArrayList<>();),那么在调用id_departamente.add(id_departament);时会抛出NullPointerException。这个异常不属于JSONException,所以不会被你当前的catch (JSONException e)捕获,会直接中断整个方法的执行,导致for循环和后续的UI代码都跑不起来。
解决方案:
在初始化这两个集合的地方(比如Activity的onCreate方法里,或者AsyncTask的构造方法里)加上初始化代码:
id_departamente = new ArrayList<>(); departamente = new ArrayList<>();
2. 服务器端PHP代码的逻辑问题
你的PHP代码把$response的赋值放在了while($stmt->fetch())循环内部,这会导致每次循环都重新给$response['departamente']赋值,虽然最后一次循环结束后结果是对的,但这是不规范的写法,而且如果数据库查询结果为空的话,$response根本不会被初始化,可能导致前端解析异常。
修复后的PHP代码:
if($stmt->num_rows > 0){ $departamente = array(); // 先初始化数组 $stmt->bind_result($departament, $id_departament); while($stmt->fetch()) { $departamente[] = array ( "Departament"=>$departament, "id_departament"=>$id_departament ); } // 把响应赋值放在循环外面 $response['error'] = false; $response['message'] = 'Alerte reimprospatate'; $response['departamente']= $departamente; } else { // 处理查询结果为空的情况 $response['error'] = true; $response['message'] = 'Nu au fost găsite departamente'; }
3. SchimbareDiactritice方法抛出未捕获异常
如果你的SchimbareDiactritice方法内部处理字符串时抛出了异常(比如数组越界、空指针等),同样会导致for循环中断,且因为不在JSONException的捕获范围内,会直接终止方法执行。
解决方案:
在调用SchimbareDiactritice的地方加上try-catch块,避免单个元素处理失败导致整个循环终止:
try { String departament = SchimbareDiactritice(dep.getString("Departament")).replace("&",""); String id_departament= dep.getString("id_departament"); id_departamente.add(id_departament); departamente.add(departament); } catch (Exception e) { e.printStackTrace(); // 可以在这里打印当前元素的错误信息,方便排查 }
4. 增加日志精准定位问题
建议在关键位置添加日志,直观看到每一步的执行情况:
@Override protected void onPostExecute(String s) { super.onPostExecute(s); Log.d("JSON_RESPONSE", "服务器完整响应: " + s); // 打印完整响应内容 try { JSONObject obj = new JSONObject(s); Log.d("JSON_CHECK", "error字段值: " + obj.getBoolean("error")); if (!obj.getBoolean("error")) { JSONArray departamenteArray = obj.getJSONArray("departamente"); Log.d("JSON_ARRAY", "数组长度: " + departamenteArray.length()); // 打印数组长度 for (int i = 0; i < departamenteArray.length(); i++) { Log.d("JSON_LOOP", "当前循环索引: " + i); // 打印循环进度 JSONObject dep = departamenteArray.getJSONObject(i); if (!dep.isNull("Departament")) { Log.d("JSON_ITEM", "Departament原始值: " + dep.getString("Departament")); String departament = SchimbareDiactritice(dep.getString("Departament")).replace("&",""); String id_departament= dep.getString("id_departament"); id_departamente.add(id_departament); departamente.add(departament); } } Log.d("COLLECTION_RESULT", "最终departamente集合大小: " + departamente.size()); } else { Toast.makeText(getApplicationContext(), "Some error occurred", Toast.LENGTH_SHORT).show(); } } catch (JSONException e) { Log.e("JSON_PARSE_ERROR", "JSON解析异常: ", e); // 打印JSON解析错误 } catch (Exception e) { Log.e("OTHER_ERROR", "其他异常: ", e); // 捕获所有未预料的异常 } layout_validare.setVisibility(GONE); linearLayout_obs_redirectionare.setVisibility(View.VISIBLE); }
通过这些日志,你可以清楚看到数组是否正常获取、循环有没有执行、哪个步骤抛出了异常,快速定位问题根源。
内容的提问来源于stack exchange,提问作者Costin

