更新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

