【问题标题】:java.lang.ArrayIndexOutOfBoundsException: length=5; index=5java.lang.ArrayIndexOutOfBoundsException:长度=5;指数=5
【发布时间】:2019-12-29 13:21:24
【问题描述】:

原因:java.lang.ArrayIndexOutOfBoundsException:length=5;指数=5 在 com.example.android.architecture.MainActivity.updateDisplay(MainActivity.kt:59) 在 com.example.android.architecture.MainActivity.onCreate(MainActivity.kt:44)

更改索引 和类视图

class MainActivity : AppCompatActivity() {

    private lateinit var dice: IntArray
    private lateinit var headlineText: String

    private val imageViews by lazy {
        arrayOf<ImageView>(findViewById(R.id.die1),
        findViewById(R.id.die1),
        findViewById(R.id.die2),
        findViewById(R.id.die3),
        findViewById(R.id.die4),
            findViewById(R.id.die5)
        )
    }
        private val headline by lazy { findViewById<TextView>(R.id.headline) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar)

        headlineText = savedInstanceState?.getString(HEADLINE_TEXT)
            ?: getString(R.string.welcome)
        dice = savedInstanceState?.getIntArray(DICE_COLLECTION)
            ?: intArrayOf(6,6,6,6,6)

        lifecycle.addObserver(MyLifeCycleObserver())

        fab.setOnClickListener{
            fabClickHandler()}

        updateDisplay()

    }


    private fun fabClickHandler(){
        dice = DiceHelper.rollDice()
        headlineText = DiceHelper.evaluateDice(this,dice)
        updateDisplay()

    }

    private fun updateDisplay() {
        for (i in 0 until imageViews.size) {

            val drawableId = when (dice[i]) {
                1 -> R.drawable.die_1
                2 -> R.drawable.die_2
                3 -> R.drawable.die_3
                4 -> R.drawable.die_4
                5 -> R.drawable.die_5
                6 -> R.drawable.die_6
                else -> R.drawable.die_6
            }
            imageViews[i].setImageResource(drawableId)
        }
        headline.text = headlineText
    }

    override fun onSaveInstanceState(outState: Bundle?) {
        outState?.putString(HEADLINE_TEXT,headlineText)
        outState?.putIntArray(DICE_COLLECTION,dice)
        super.onSaveInstanceState(outState)
    }
}

不确定为什么我的 android 应用程序没有运行

【问题讨论】:

  • 您能否在第 59 行和第 44 行用注释标记您遇到异常的地方?
  • dice 只有 5 个元素,imageViews 可能更多(那不是(纯)java!!)
  • 那不是java @CarlosHeuberger,应该去掉标签,你是对的
  • @a_local_nobody 但这应该是 OP 的职责....(我写第一条评论时只有 Java 标记)
  • 不,我同意,不是说你错了,实际上只是和你确认它不是 java :) @CarlosHeuberger

标签: android kotlin


【解决方案1】:

长度是常数,用于找出数组的存储容量,而不是数组中的元素个数。

数组中元素的数量称为size

如果您使用具有 5 个元素的数组,则您的最后一个元素的 index 必须为 4。因为所有数组都从索引 0 开始。

Difference between size and lenght

【讨论】:

    【解决方案2】:

    如果保存实例为空,您将使用五个元素初始化骰子数组

    "dice = savedInstanceState?.getIntArray(DICE_COLLECTION)
        ?: intArrayOf(6,6,6,6,6)"'
    

    ================================================ ============= 你的 Imageviews 数组有 6 个元素

    private val imageViews by lazy {
            arrayOf<ImageView>(findViewById(R.id.die1),
            findViewById(R.id.die1),
            findViewById(R.id.die2),
            findViewById(R.id.die3),
            findViewById(R.id.die4),
                findViewById(R.id.die5)
            )
        }
    

    ================================================ ====== 所以当你在循环运行中访问骰子元素时

    for (i in 0 until imageViews.size) {
                val drawableId = when (dice[i]) {
    

    它给出异常

    【讨论】:

      【解决方案3】:

      dice 大小为 5,而 ImageViews 有 6 个元素,因此循环运行 6 次,在第六次迭代中发生异常

      【讨论】:

        【解决方案4】:

        错误在这里:

        for (i in 0 until imageViews.size) {
                    val drawableId = when (dice[i]) {
        

        imageViews 有 6 个元素。
        dice 有 5 个元素。

        dice = savedInstanceState?.getIntArray(DICE_COLLECTION)
                    ?: intArrayOf(6,6,6,6,6)
        
        private val imageViews by lazy {
                arrayOf<ImageView>(
                  findViewById(R.id.die1),  
                  findViewById(R.id.die1),  //maybe it is duplicated
                  findViewById(R.id.die2),
                  findViewById(R.id.die3),
                  findViewById(R.id.die4),
                  findViewById(R.id.die5)
                )
        

        【讨论】:

          猜你喜欢
          • 2018-06-01
          • 2018-11-05
          • 1970-01-01
          • 1970-01-01
          • 2013-06-07
          • 1970-01-01
          • 2014-05-13
          • 2023-02-13
          • 1970-01-01
          相关资源
          最近更新 更多