Android Studio Kotlin получен двумерный массив кнопок java .lang.ArrayIndexOutOfBoundsException: length = 0; Индекс = 0 - PullRequest
1 голос
/ 28 марта 2020

Я хочу сделать игру ti c ta c toe с Kotlin.

Двумерными кнопками 3x3, но получил это сообщение об ошибке. Я не знаю, как Kotlin точно объявить двумерный массив и инициализировать, и как решить эту проблему ......

2020-03-28 16:27:45.705 30315-30315/com.leaf76.tictactoe E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.leaf76.tictactoe, PID: 30315
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.leaf76.tictactoe/com.leaf76.tictactoe.MainActivity}: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3448)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3595)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2147)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:7811)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1076)
     Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
        at com.leaf76.tictactoe.MainActivity.onCreate(MainActivity.kt:46)
        at android.app.Activity.performCreate(Activity.java:7955)
        at android.app.Activity.performCreate(Activity.java:7944)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3423)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3595) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2147) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:237) 
        at android.app.ActivityThread.main(ActivityThread.java:7811) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1076) 

Я объявляю это

.....
private var buttons = arrayOf<Array<Button>>()
private var player1Turn: Boolean = true
.....

Я использовал для l oop, чтобы добавить идентификатор кнопки просмотра в массив кнопок и сделать щелчок кнопки, чтобы изменить текст "X" и "O"

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    textViewPlayer1 = text_view_p1
    textViewPlayer2 = text_view_p2

    for (i in 0 until 3) {
        for (j in 0 until 3) {
            val buttonId = "button_$i$j"
            val resId = resources.getIdentifier(buttonId, "id", packageName)

            buttons[i][j] = findViewById(resId)  // **here got error**

            buttons[i][j].setOnClickListener { v ->
                if (player1Turn) {
                    (v as Button).text = "X"
                } else {
                    (v as Button).text = "O"
                }
              ....
            }
        }
    }
}

1 Ответ

0 голосов
/ 28 марта 2020

Вы фактически объявили пустой массив с этой строкой кода.

arrayOf<Array<Button>>()

Вам необходимо добавить некоторые элементы в этот массив. Итак, вам нужно сделать что-то вроде этого:

private var buttons = arrayOf<Array<Button>>(arrayOfNulls<Button>(3), arrayOfNulls<Button>(3), arrayOfNulls<Button>(3))

Итак, с помощью этой части мы создадим массив массивов, в котором есть 3 типа кнопок, которые могут быть обнуляемыми. Поскольку внутри массивов есть типы, допускающие значения NULL, вам нужно использовать ? везде, где вы обращаетесь к элементам массива. Например, когда вы вызываете clickListener для одной кнопки, вам нужно сделать это следующим образом:

buttons[i][j]?.setOnClickListener

Но для вашего примера я бы не использовал массивы для хранения кнопок, но я бы использовал ArrayList, который может динамически принимать предметы. С ArrayList ваш код будет выглядеть примерно так:

Объявление массива:

private var buttons =  arrayOf<ArrayList<Button>>(arrayListOf(), arrayListOf(), arrayListOf())

для циклов:

for (i in 0 until 3) {
        for (j in 0 until 3) {
            val buttonId = "button_$i$j"
            val resId = resources.getIdentifier(buttonId, "id", packageName)

            buttons[i].add(findViewById(resId))

            buttons[i][j].setOnClickListener { v ->
                if (player1Turn) {
                    (v as Button).text = "X"
                } else {
                    (v as Button).text = "O"
                }
                ....
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...