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

Android计算器开发clear按钮触发IndexOutOfBoundsException异常如何解决

错误信息:java.lang.IndexOutOfBoundsException: setSpan (5 ... 5) ends beyond length 4

异常产生原因

  • 错误根因出在updateText()方法的内部逻辑,和你贴出的clear按钮点击事件、布局代码没有直接关联
  • 该报错属于Span操作越界:说明updateText()内部存在对富文本(Spannable)的样式修改逻辑,比如给计算器的运算符、数字设置不同颜色、字号的自定义样式
  • 点击clear按钮传入空字符串时,updateText()没有做空文本的边界校验,依然尝试对不存在的字符位置设置Span;或是之前记录的Span起止位置参数没有随文本清空重置,仍在尝试对长度为0的空文本应用旧的、超出当前文本长度的Span配置。

解决方案

修改updateText()方法,增加边界校验逻辑即可:

  1. 所有Span操作执行前,先校验文本长度和Span的有效性:
private void updateText(String newText) {
    // 空文本场景直接处理
    if (newText == null || newText.isEmpty()) {
        binding.displayTv.setText("");
        // 同步重置所有保存Span起止位置的全局变量
        spanStartPos = 0;
        spanEndPos = 0;
        return;
    }
    // 原有非空文本的处理逻辑
    SpannableString spannable = new SpannableString(newText);
    // Span设置前额外加校验,避免越界
    if (spanEndPos <= newText.length()) {
        spannable.setSpan(yourCustomSpan, spanStartPos, spanEndPos, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
    binding.displayTv.setText(spannable);
}
  1. 也可以在clear按钮的点击事件中增加文本非空判断,提前拦截无效操作:
binding.clearBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        String currentContent = binding.displayTv.getText().toString();
        if (!currentContent.isEmpty()) {
            updateText("");
        }
    }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 05:06:04