kotlin 尝试使用适配器内的变量设置BackgroundColor时出现StringIndexOutofBoundsException,原因是什么?

sh7euo9m  于 2023-03-03  发布在  Kotlin
关注(0)|答案(1)|浏览(195)

我有以下绑定方法:

override fun onBindViewHolder(holder: bomViewHolder, position: Int) {
  val color=ListTheColorTone[position].color
  holder.cardBlack.setCardBackgroundColor(Color.parseColor(color!!))
}

调用时,我得到以下错误:

java.lang.StringIndexOutOfBoundsException: length=0; index=0
  at java.lang.String.charAt(Native Method)
  at android.graphics.Color.parseColor(Color.java:1384)
  at com.example.wallpaperapp.Adapter.colortoneAdapter.onBindViewHolder(colortoneAdapter.kt:33)
  at com.example.wallpaperapp.Adapter.colortoneAdapter.onBindViewHolder(colortoneAdapter.kt:15)
  at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)
  at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107)
  at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline (RecyclerView.java:6012)

当我手动插入字符串到parseColor中时就不会发生这种情况,例如parseColor("#ffffff");就可以正常工作。
以下是截图供参考:

9jyewag0

9jyewag01#

StringIndexOutOfBoundsException是一个未选中的异常,当试图访问索引为负或大于字符串长度的字符串字符时,会发生该异常。
由String方法引发,以指示索引为负或大于字符串的大小。对于某些方法(如charAt方法),当索引等于字符串的大小时也会引发此异常。
因此,某个地方的某个东西试图访问索引为负或大于字符串长度的字符,如果我们查看堆栈跟踪,我们可以看到异常是从Color.parseColor方法抛出的:

// TIP: Length of 0 means an empty string!
java.lang.StringIndexOutOfBoundsException: length=0; index=0
  at java.lang.String.charAt(Native Method)
  at android.graphics.Color.parseColor(Color.java:1384)
  // The stack trace is guiding us to line 33!
  at com.example.wallpaperapp.Adapter.colortoneAdapter.onBindViewHolder(colortoneAdapter.kt:33)
  at com.example.wallpaperapp.Adapter.colortoneAdapter.onBindViewHolder(colortoneAdapter.kt:15)
  at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)
  at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107)
  at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline (RecyclerView.java:6012)

因此,Color.parseColor获取一个空("")字符串作为参数,我们可以看到颜色来自一个名为ListTheColorTone的集合:

override fun onBindViewHolder(holder: bomViewHolder, position: Int) {
  val color=ListTheColorTone[position].color // <= This returns an empty String
  
  holder.cardBlack.setCardBackgroundColor(Color.parseColor(color!!)) // <= This is the line where the exception is thrown
}

这对我们意味着什么?

ListTheColorTone集合可能在传递的position中缺少一个元素,或者应用程序中的某些其他逻辑不正确。正如@Zabuzard建议的那样,尝试打印position的值(或者集合的内容)以了解问题所在:

override fun onBindViewHolder(holder: bomViewHolder, position: Int) {
  val color=ListTheColorTone[position].color // <= This returns an empty string

  println("position: $position")
  println("ListTheColorTone: ${ListTheColorTone.toList()}")
  println("color: $color")

  holder.cardBlack.setCardBackgroundColor(Color.parseColor(color!!)) // <= This is the line where the exception is thrown
}

或者更好的方法是,尝试在抛出异常的那一行添加一个断点,并检查positionListTheColorTone.size的值。

相关问题