Reputation:
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
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
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
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
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