线程“main”中出现异常java.lang.IndexOutOfBoundsException:至索引= 8 [已关闭]

j9per5c4  于 2023-02-28  发布在  Java
关注(0)|答案(1)|浏览(227)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
2天前关闭。
Improve this question
我想写一个生成汉明码的代码,但是当我输入“101”时,我得到一个错误:

`at java.base/java.util.AbstractList.subListRangeCheck(AbstractList.java:509)
at java.base/java.util.ArrayList.subList(ArrayList.java:1108)
at kotlin.collections.CollectionsKt___CollectionsKt.slice(_Collections.kt:866)
at ProverkaKt.main(proverka.kt:52)`

我刚到Kotlin,所以不明白问题出在哪里。

import kotlin.math.*

fun main(args: Array<String>) {
    val option = readLine()!!.toInt()
    if(option == 1){
        println("Введите биты данных")
        val d = readLine()!!
        val raz = d.toMutableList()
        val data = raz.reversed()
        println(data)

        var (c: Int, ch: Int, j: Int) = List(3) { 0 }
        val h : ArrayList<Int> = ArrayList()
        var r = 0.0

        while ( (d.length + r + 1) > (2.0.pow(r))) {
            r = r + 1

        }

        for(i in 0 until ((r+data.size).toInt())){
            val p = 2.0.pow(c)
            val k = data[j].toString()

            if(p.toInt() == (i+1)) {
                h.add(0)
                c = c + 1
            }
            else {

                h.add(k.toInt())
                j = j + 1

            }
            println(h)

        }
        println("---------------------------")

        for(parity in 0 until h.size){
            val ph =  2.0.pow(ch)

            if (ph.toInt() == (parity + 1)) {
                val startIndex: Int = ph.toInt() - 1
                var i = startIndex
                var toXor : ArrayList<Int> = ArrayList()

                while( i < h.size) {
                    val block = h.slice(i .. ((i+ph).toInt()))
                    toXor += block
                    i += 2 * ph.toInt()
                    println("toXor = $toXor")
                    println("H = $h")
                    println("startIndex  = $startIndex")
                }

                for (z in 1 until  toXor.size) {
                    h[startIndex]=h[startIndex] xor toXor[z]
                }
                ch+=1

            }
        }

        h.reverse()
        println("Сгенерированный код Хэмминга будет: - ")
        print(h.toString())

    }

}

我的英语不好,所以我不知道如何做类似的问题。
为了发布代码,还需要编写一些其他的东西,这到底是什么必要的

r6vfmomb

r6vfmomb1#

Exception in thread "main" java.lang.IndexOutOfBoundsException: toIndex = 8

这意味着你试图访问索引 8,在一个 * 没有 * 第8个索引的集合中。如果你的集合是[a, b, c],那么它是3个元素,所以你可以使用索引 0 来索引 2。任何更高或更低的都是越界的。

at kotlin.collections.CollectionsKt___CollectionsKt.slice(_Collections.kt:866)
at ProverkaKt.main(proverka.kt:52)

您的错误来自main()的第 52 行上的slice调用,即:

val block = h.slice(i .. ((i+ph).toInt()))

所以ii+ph太大了(根据错误,它是 8),所以你需要找出发生这种情况的原因,你可以试着调试代码,或者记录变量的值,这样你就可以观察它们是如何变化的(看看哪里出错了)。

相关问题