Kotlin 错误:计算数组和时发生IndexOutOfBoundsException

Kotlin 错误:计算数组和时发生IndexOutOfBoundsException,kotlin,exception,compiler-errors,Kotlin,Exception,Compiler Errors,我正在计算数组的和 fun main (args: Array<String>) { var myArray = arrayOf(66, 23, 5, 46, 76, 56, 3, 277, 6, 9494, 574, 34, 23, 6467, 13, 64, 75, 634, 234, 2314) println("The sum of the array is: ${getSumArray(myArray)}") } fun getSumA

我正在计算数组的和

fun main (args: Array<String>) {
   var myArray = arrayOf(66, 23, 5, 46, 76, 56, 3, 277, 6, 9494, 574, 34, 23, 6467, 13, 64, 75, 634, 234, 2314)
   println("The sum of the array is: ${getSumArray(myArray)}")
}
   fun getSumArray(myArray: Array<Int>): Int {
      var total = 0
      var index = 0
      for (number in myArray) {
         do {
            total = total + myArray[index]
            index++
         } while (index < myArray.size)
      }
      return total
   }
fun main(args:Array){
var myArray=arrayOf(66,23,5,46,76,56,3277,69494,574,34,236467,13,64,75634234314)
println(“数组的和为:${getSumArray(myArray)}”)
}
fun getSumArray(myArray:Array):Int{
var总计=0
var指数=0
for(myArray中的数字){
做{
总计=总计+myArray[索引]
索引++
}while(索引
IDE打印一个错误:

线程“main”java.lang.ArrayIndexOutOfBoundsException中的异常: 索引20超出长度为20的范围 练习SKT.getSumArray(练习kt:19)在 主要练习(练习kt:12)

我发现:

公共类IndexOutOfBoundsException扩展了引发的运行时异常 指示某种类型的索引(例如到数组、到 字符串或向量)超出范围


我的理解是,
索引
超出了
myArray.size
的范围。为什么会这样?

对于(myArray中的数字)
循环的
目的是什么?这是这个错误的根源。在这个循环的第一次迭代之后,
索引
变量等于
myArray.size
。在下一次迭代中,您会得到这个异常,因为在do while循环中,主体首先执行,然后检查条件


顺便说一句,kotlin中为数组定义了一个很好的方法。

您将迭代数组两次,一次使用
for
循环和内部
do while
循环。由于
索引
是在两个循环之外定义的,因此它被分配给
myArray.size
。尝试访问索引大于size-1的数组元素将抛出
ArrayIndexOutOfBoundsException

如何调试

对于初学者,开始在代码中添加
print
语句,查看特定时刻的值。如果您使用的是Intellij之类的IDE,请开始使用断点检查值是否在运行时可用

这里有几个替代方案来解决这个问题

只使用for循环

fun getSumArray(myArray: Array<Int>): Int {
  var total = 0
  for (number in myArray) {
    total += number
  }
  return total
}
fun getSumArray(myArray:Array):Int{
var总计=0
for(myArray中的数字){
总数+=个数
}
返回总数
}
或者使用while循环

fun getSumArray(myArray: Array<Int>): Int {
  var total = 0
  var index = 0
    do {
      total = total + myArray[index]
      index++
    } while (index < myArray.size)
  return total
}
fun getSumArray(myArray:Array):Int{
var总计=0
var指数=0
做{
总计=总计+myArray[索引]
索引++
}while(索引
或者使用Kotlin的现有函数来获取和

fun getSumArray(myArray: Array<Int>): Int {
  return myArray.sum()
}
fun getSumArray(myArray:Array):Int{
返回myArray.sum()
}
一些附加(不必要)选项

fun getSumArray(myArray:Array):Int{
var总计=0
myArray.forEach{
总数+=它
}
返回总数
}

fun getSumArray(myArray:Array):Int{
返回myArray.reduce{acc,n->acc+n}
}
为(myArray中的数字){
之后添加
println(数字)
fun getSumArray(myArray: Array<Int>): Int {
  var total = 0
  myArray.forEach {
    total+=it
  }
  return total
}
fun getSumArray(myArray: Array<Int>): Int {
  return myArray.reduce { acc, n -> acc + n }
}