user11748196
user11748196

Reputation:

java.lang.ArrayIndexOutOfBoundsException: length=5; index=5

Caused by: java.lang.ArrayIndexOutOfBoundsException: length=5; index=5 at com.example.android.architecture.MainActivity.updateDisplay(MainActivity.kt:59) at com.example.android.architecture.MainActivity.onCreate(MainActivity.kt:44)

changing the index and class view

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)
    }
}

Unsure why my android application isn't running

Upvotes: 1

Views: 623

Answers (4)

POMAIIIUK
POMAIIIUK

Reputation: 509

Length is constant which is used to find out the array storing capacity not the number of elements in the array.

Number of elements in the array is called size.

If you use array with 5 elements, your last element must have index 4. Because all arrays start from index 0.

Difference between size and lenght

Upvotes: 0

Yousaf Raza
Yousaf Raza

Reputation: 793

You are initializing your dice array with five elements in case of null savedinstance

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

=========================================================== And your Imageviews Array has 6 elements

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)
        )
    }

===================================================== so while you are accessing dice elements in loop running

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

It give exception

Upvotes: 1

Vibhanshu Sharma
Vibhanshu Sharma

Reputation: 259

dice is of size 5 where while ImageViews has 6 elements so the loop run 6 times and in the sixth iteration Exception occurs

Upvotes: 1

Gabriele Mariotti
Gabriele Mariotti

Reputation: 365148

The error is here:

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

imageViews has 6 elements.
dice has 5 elements.

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)
        )

Upvotes: 0

Related Questions