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

Android Studio发送JSONObject报StackOverflowError异常如何解决?

报错含义

Method threw 'java.lang.StackOverflowError' exception. Cannot evaluate org.json.JSONObject.toString()
该报错表示安卓自带的org.json.JSONObject执行toString()序列化操作时,递归调用深度超出了ART虚拟机的栈深度限制,触发栈溢出。你提到缩小JSON体积就可以正常发送,恰好对应递归深度下降、栈占用回到合法阈值的情况。

问题根因
  • 你的POST参数拼接逻辑存在缺陷:直接将JSONObject实例和其他字符串拼接,隐式调用toString(),且没有对参数值做URL编码。如果用户从网页复制的内容中包含&、%、+等表单特殊字符,不仅会破坏POST请求的参数结构,还可能导致JSONObject序列化逻辑出现异常递归。
  • 现有文本清理规则覆盖不全:从网页复制的内容通常会携带零宽字符、不间断空格、HTML转义实体等不可见特殊字符,你当前的正则规则没有覆盖这类字符,会干扰JSONObject的正常序列化。
解决步骤
  • 修正POST参数提交逻辑
    不要手动拼接表单字符串,对每个参数值单独做URL编码后再拼接,同时移除多余的connection.connect()调用(HttpURLConnection在获取输出流时会自动完成连接,后置调用会引发额外异常):
    // 先单独序列化JSON,方便单独定位序列化问题
    String jsonContent = finalobjectCopy.toString();
    // 逐个编码参数值,避免特殊字符破坏参数结构
    String postBody = "idUser=" + URLEncoder.encode(idUser, StandardCharsets.UTF_8.name())
            + "&myJsonArray=" + URLEncoder.encode(jsonContent, StandardCharsets.UTF_8.name())
            + "&act=backupDados_V2"
            + "&data=" + URLEncoder.encode(currentDateandTime, StandardCharsets.UTF_8.name());
    bufferedWriter.write(postBody);
    
  • 完善文本清理规则
    补充清理网页内容常见的特殊字符:
    // 移除零宽字符
    myString = myString.replaceAll("[\u200B-\u200D\uFEFF]", "");
    // 替换不间断空格为普通空格
    myString = myString.replaceAll("\u00A0", " ");
    // 移除HTML转义实体,不需要保留HTML格式可开启
    myString = myString.replaceAll("&[a-zA-Z0-9]+;", "");
    // 原有清理规则保留
    myString = myString.replaceAll("[^\\x00-\\x7F]", "");
    myString = myString.replaceAll("[\\p{Cntrl}&&[^\r\n\t]]", "");
    
  • 替换JSON序列化库(可选)
    安卓原生org.json库的容错性和性能表现较差,对于复杂文本场景容易出现异常,可以替换为Gson、FastJSON等第三方JSON序列化库,规避原生库的栈溢出问题。

内容的提问来源于stack exchange,提问作者Manuel Rodrigues

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:27:03