public SpannableStringBuilder append(CharSequence text) {
int length = length();
return replace(length, length, text, 0, text.length());
}
使用SpannableStringBuilder
的append
方法时,注意上述源码中的text.length()
,一旦你append的字符串为null
,就会NullPointerException
。实际开发中,往往需要拼接的几个字段都是后台数据json解析而来,就我目前使用的框架fastjson
而言,如果后台不返回该字段,则相应字段就是null
,所以这个坑还是很容易踩到的
//StringBuilder方法
@Override
public StringBuilder append(CharSequence s) {
super.append(s);
return this;
}
//AbstractStringBuilder方法
@Override
public AbstractStringBuilder append(CharSequence s) {
if (s == null)
return appendNull();
if (s instanceof String)
return this.append((String)s);
if (s instanceof AbstractStringBuilder)
return this.append((AbstractStringBuilder)s);
return this.append(s, 0, s.length());
}
//appendNull拼接的是null字符串
private AbstractStringBuilder appendNull() {
int c = count;
ensureCapacityInternal(c + 4);
final char[] value = this.value;
value[c++] = 'n';
value[c++] = 'u';
value[c++] = 'l';
value[c++] = 'l';
count = c;
return this;
}
以上源码可以看出StringBuilder
的append
方法遇到null
会追加一个"null"
字符串,而不是出现异常
因此开发中,一般是用StringBuilder
拼接字符串,拼接好之后再SpannableString ss = new SpannableString(sb.toString())
,这样可以有效的避免NullPointerException
引起程序崩溃。一般后台返回的字段都是一些必填项,而且我们通过此类处理,多是为了改变部分字体颜色、字号、点击事件等,因此使用此方法可以有效解决因异常数据
导致的闪退。
如果不是以上的情况,建议通过三目运算符对数据进行判空TextUtils.isEmpty(str) ? "" : str