【问题标题】:Kotlin - IndexOutOfBoundsException when converting it from JavaKotlin - 从 Java 转换时出现 IndexOutOfBoundsException
【发布时间】:2018-12-06 23:29:30
【问题描述】:

目前我正在尝试学习在 Kotlin 中制作游戏,并且我正在将 Java 代码转换为 Kotlin,除了以下问题之外一切正常。

//Missile.kt

class Missile(context: Context) {

    internal var x: Int = 0
    internal var y: Int = 0
    internal var mVelocity: Int = 0
    internal var missile: Bitmap = BitmapFactory.decodeResource(context.resources, R.drawable.missile)

    val missileWidth: Int
        get() = missile.width
    val missileHeight: Int
        get() = missile.height

    init {
        x = GameView.dWidth / 2 - missileWidth / 2
        y = GameView.dHeight - GameView.tankHeight - missileHeight / 2
        mVelocity = 50
    }
}


//In Kotlin

for (i in missiles.indices) {

    if (missiles[i].y >- missiles[i].missileHeight) {

        missiles[i].y -= missiles[i].mVelocity

        canvas.drawBitmap(missiles[i].missile, missiles[i].x.toFloat(), missiles[i].y.toFloat(), null)

        if (missiles[i].x >= planes[0].planeX && missiles[i].x + missiles[i].missileWidth <= planes[0].planeX + planes[0].width && missiles[i].y >= planes[0].planeY &&

                missiles[i].y <= planes[0].planeY + planes[0].height) {

            val explosion = Explosion(context)

            explosion.explosionX = planes[0].planeX + planes[0].width / 2 - explosion.explosionWidth / 2

            explosion.explosionY = planes[0].planeY + planes[0].height / 2 - explosion.explosionHeight / 2

            explosions.add(explosion)

            planes[0].resetPosition()

            count++

            missiles.removeAt(i)

            if (point != 0) {

                sp.play(point, 1f, 1f, 0, 0, 1f)

            }



//In Java

for (int i = 0; i < missiles.size(); i++) {

    if (missiles.get(i).y > -missiles.get(i).getMissileHeight()) {

        missiles.get(i).y -= missiles.get(i).mVelocity;

        canvas.drawBitmap(missiles.get(i).missile, missiles.get(i).x, missiles.get(i).y, null);

        if (missiles.get(i).x >= planes.get(0).planeX && (missiles.get(i).x + missiles.get(i).getMissileWidth())

                <= (planes.get(0).planeX + planes.get(0).getWidth()) && missiles.get(i).y >= planes.get(0).planeY &&

                missiles.get(i).y <= (planes.get(0).planeY + planes.get(0).getHeight())) {

            Explosion explosion = new Explosion(context);

            explosion.explosionX = planes.get(0).planeX + planes.get(0).getWidth()/2 - explosion.getExplosionWidth()/2;

            explosion.explosionY = planes.get(0).planeY + planes.get(0).getHeight()/2 - explosion.getExplosionHeight()/2;

            explosions.add(explosion);

            planes.get(0).resetPosition();

            count++;

            missiles.remove(i);

            if(point != 0){

                sp.play(point, 1, 1, 0, 0, 1);

            }

导致的部分如下。

java.lang.IndexOutOfBoundsException: Index: 1, Size: 1

java.lang.IndexOutOfBoundsException: Index: 2, Size: 2



if (missiles[i].y >- missiles[i].missileHeight) {

所以,情况是如果我按两次大炮,会导致java.lang.IndexOutOfBoundsException: Index: 1, Size: 1

如果我按三下大炮,会导致java.lang.IndexOutOfBoundsException: Index: 2, Size: 2.

如果我只按一次大炮,就不会崩溃。

我很想获得有关如何解决问题的可能建议。

【问题讨论】:

    标签: java android kotlin indexoutofboundsexception


    【解决方案1】:

    我相信这是因为您正在删除导致索引不正确的元素。如果要从列表中删除元素,则应使用 Iterator 迭代列表。

    Iterator itr = missiles.iterator();
    while(itr.hasNext()){
        Object missile = itr.next(); 
        itr.remove();
    }
    

    删除也会将其从您的导弹列表中删除。

    【讨论】:

    • 您好,感谢您的建议,我试过了,但似乎不起作用。你能详细告诉我我应该如何实现它吗?
    • 如果你告诉我你有什么以及你的意思是它不起作用,我会尽力提供帮助。
    猜你喜欢
    • 2012-06-14
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 2013-11-08
    • 1970-01-01
    • 2020-11-01
    相关资源
    最近更新 更多