Android Studio Kotlin 2 차원 Button 배열에 java.lang.ArrayIndexOutOfBoundsException이 있습니다. length = 0; 인덱스 = 0

잎 76

Kotlin으로 틱택 토 게임을 만들고 싶습니다.

2 차원 3x3 버튼이지만이 오류 메시지가 표시됩니다. Kotlin이 2 차원 배열을 정확히 선언하고 초기화하는 방법과이 문제를 해결하는 방법을 모르겠습니다.

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
.....

버튼 배열에보기 버튼 ID를 추가하기 위해 for 루프를 사용하고 버튼 클릭으로 텍스트 "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"
                }
              ....
            }
        }
    }
}
BVan

이 코드 줄로 실제로 빈 배열을 선언했습니다.

arrayOf<Array<Button>>()

이 배열에 몇 가지 항목을 추가해야합니다. 따라서 다음과 같이해야합니다.

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

따라서이 부분에서는 내부에 3 개의 nullable Button 유형이있는 배열의 배열을 만듭니다. 배열 내부에 nullable 형식이 있으므로 ?배열 항목에 액세스 할 때마다 사용해야 합니다. 예를 들어, 단일 버튼에서 clickListener를 호출 할 때 다음과 같이해야합니다.

buttons[i][j]?.setOnClickListener

그러나 예를 들어 Button을 저장하는 데 배열을 사용하지 않지만 항목을 동적으로 수락 할 수있는 ArrayList를 사용합니다. ArrayList를 사용하면 코드는 다음과 같습니다.

배열 선언 :

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

for 루프 :

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"
                }
                ....
            }
        }

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관