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

更新TextView触发应用崩溃,求分析SIGABRT错误原因及解决办法

问题分析与解决方案

你遇到的A/libc: Fatal signal 6 (SIGABRT), code -6 (SI_TKILL)错误是系统发出的中止信号,通常意味着代码触发了未被捕获的致命错误(比如空指针异常、非法内存访问等)。结合你的代码来看,虽然JSON解析正常,但更新TextView时的空指针或非法数据访问是最可能的原因,下面一步步帮你排查:

错误根源排查

1. TextView引用是否为空

首先确认txt_articolo和txt_contatore在MainActivity中是否正确初始化。比如你有没有在onCreate中通过findViewById获取到这两个控件的实例?如果控件ID写错或者布局里没有对应的TextView,这两个变量会是null,调用setText时就会触发致命错误。

你可以在调用dati.stampaDati(...)前加个检查:

if (txt_articolo == null || txt_contatore == null) {
    Log.e("MainActivity", "TextView references are null!");
    return;
}

2. 数组越界或Article实例为空

你的Dati.articoli是ArrayMap<Integer, Article>,在循环中用i作为键存入数据。但要注意:

  • JSON中的totalResults是总结果数,而返回的articles数组是当前请求的部分数据(比如分页返回),所以articoli.size()大概率小于totalResults。
  • 当你调用stampaDati(0, ...)时,虽然0是合法索引,但如果articoli.get(0)返回null(比如循环中存入失败,或者JSON解析时Article实例创建有问题),后续访问sourceA.name就会触发空指针。

在Dati.stampaDati方法里先做安全检查:

public void stampaDati(int articoloCorrente, TextView txt_articolo, TextView txt_contatore){
    Log.i("asd",Integer.toString(this.totalResults));
    
    // 检查索引是否合法
    if (articoloCorrente < 0 || articoloCorrente >= articoli.size()) {
        Log.e("Dati", "Invalid position: " + articoloCorrente + ", total articles: " + articoli.size());
        txt_contatore.setText("Invalid article");
        txt_articolo.setText("");
        return;
    }
    
    Article targetArticle = articoli.get(articoloCorrente);
    // 检查Article实例是否为空
    if (targetArticle == null) {
        Log.e("Dati", "Article at position " + articoloCorrente + " is null");
        txt_articolo.setText("Article data missing");
        txt_contatore.setText("articolo "+(articoloCorrente+1)+" di "+Integer.toString(this.totalResults));
        return;
    }
    
    // 检查Source实例及name是否为空
    if (targetArticle.sourceA == null) {
        Log.e("Dati", "Source info missing for article " + articoloCorrente);
        txt_articolo.setText("No source info");
    } else if (targetArticle.sourceA.name == null) {
        txt_articolo.setText("Autore: Unknown");
    } else {
        txt_articolo.setText("Autore:"+ targetArticle.sourceA.name);
    }
    
    txt_contatore.setText("articolo "+(articoloCorrente+1)+" di "+Integer.toString(this.totalResults));
}

3. 未捕获的异常扩散

你的onPostExecute里用了try-catch包裹JSON解析,但stampaDati方法中的异常没有被捕获。如果stampaDati里触发空指针,会直接抛出导致应用崩溃,进而触发SIGABRT信号。

可以在调用stampaDati时也加上异常捕获:

try {
    dati.stampaDati(0,txt_articolo,txt_contatore);
} catch (Exception e) {
    e.printStackTrace();
    Log.e("MainActivity", "Error updating TextViews: " + e.getMessage());
}

总结

最可能的原因是articoli.get(0)返回null,或者sourceA/sourceA.name为空,加上TextView引用可能未正确初始化。通过上面的安全检查和日志输出,你可以快速定位到具体哪一步出了问题,然后针对性修复。

内容的提问来源于stack exchange,提问作者Matteo Crosilla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:23:06