You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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("&amp;","");
    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("&amp;","");
                    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 20:17:46