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()方法,增加边界校验逻辑即可:
- 所有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); }
- 也可以在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
相关产品推荐
相关产品推荐

