大家好,开发者们,我是学习android开发的新手,我用Kotlin做了一个tic tac toe游戏,它运行得很好,但我写了一个函数,让设备和我玩,但我得到了这个错误
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.ticgame, PID: 28043
java.lang.IllegalStateException: Could not execute method for android:onClick
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:414)
at android.view.View.performClick(View.java:5338)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:992)
at android.view.View$PerformClick.run(View.java:21539)
at android.os.Handler.handleCallback(Handler.java:819)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:210)
at android.app.ActivityThread.main(ActivityThread.java:5982)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:852)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:742)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
at android.view.View.performClick(View.java:5338)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:992)
at android.view.View$PerformClick.run(View.java:21539)
at android.os.Handler.handleCallback(Handler.java:819)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:210)
at android.app.ActivityThread.main(ActivityThread.java:5982)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:852)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:742)
Caused by: java.lang.IllegalArgumentException: n <= 0: 0
at java.util.Random.nextInt(Random.java:182)
at com.example.ticgame.MainActivity.AutoPaly(MainActivity.kt:132)
at com.example.ticgame.MainActivity.PLayGame(MainActivity.kt:55)
at com.example.ticgame.MainActivity.AutoPaly(MainActivity.kt:149)
at com.example.ticgame.MainActivity.PLayGame(MainActivity.kt:55)
at com.example.ticgame.MainActivity.AutoPaly(MainActivity.kt:149)
at com.example.ticgame.MainActivity.PLayGame(MainActivity.kt:55)
at com.example.ticgame.MainActivity.AutoPaly(MainActivity.kt:149)
at com.example.ticgame.MainActivity.PLayGame(MainActivity.kt:55)
at com.example.ticgame.MainActivity.AutoPaly(MainActivity.kt:149)
at com.example.ticgame.MainActivity.PLayGame(MainActivity.kt:55)
at com.example.ticgame.MainActivity.AutoPaly(MainActivity.kt:149)
at com.example.ticgame.MainActivity.PLayGame(MainActivity.kt:55)
at com.example.ticgame.MainActivity.AutoPaly(MainActivity.kt:149)
at com.example.ticgame.MainActivity.PLayGame(MainActivity.kt:55)
at com.example.ticgame.MainActivity.AutoPaly(MainActivity.kt:149)
at com.example.ticgame.MainActivity.PLayGame(MainActivity.kt:55)
at com.example.ticgame.MainActivity.AutoPaly(MainActivity.kt:149)
at com.example.ticgame.MainActivity.PLayGame(MainActivity.kt:55)
at com.example.ticgame.MainActivity.buClick(MainActivity.kt:43)
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
at android.view.View.performClick(View.java:5338)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:992)
at android.view.View$PerformClick.run(View.java:21539)
at android.os.Handler.handleCallback(Handler.java:819)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loop(Looper.java:210)
at android.app.ActivityThread.main(ActivityThread.java:5982)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:852)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:742) 主要活动
package com.example.ticgame
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_main.*
import java.util.Random
import android.widget.Button
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
var activePlayer=1
var player1=ArrayList<Int>()
var player2=ArrayList<Int>()
var Draw:Int=0单击函数
fun buClick(View:View) {
val BuSelected= View as Button
var CellId=0
when(BuSelected.id){
R.id.button1-> CellId = 1
R.id.button2-> CellId = 2
R.id.button3-> CellId = 3
R.id.button4-> CellId = 4
R.id.button5-> CellId = 5
R.id.button6-> CellId = 6
R.id.button7-> CellId = 7
R.id.button8-> CellId = 8
R.id.button9-> CellId = 9
}
Log.d("buCliked",BuSelected.id.toString())
Log.d("buCliked", CellId.toString())
PLayGame(CellId,BuSelected)
}玩游戏功能
fun PLayGame(CellId:Int,BuSelected:Button ) {
if (activePlayer==1){
Toast.makeText(this,"Player 1 played X",Toast.LENGTH_SHORT).show()
BuSelected.text="X"
BuSelected.setBackgroundResource(R.color.Blue)
player1.add(CellId)
AutoPlay()
Draw++
activePlayer=2
}else {
Toast.makeText(this,"Player 2 played O",Toast.LENGTH_SHORT).show()
BuSelected.text="O"
BuSelected.setBackgroundResource(R.color.Green)
player2.add(CellId)
Draw++
activePlayer=1
}
BuSelected.isEnabled=false //No one can't Click on button againe
CheckWinner(BuSelected)
}Check Winner函数
fun CheckWinner(BuSelected:Button ){
var Winner:Int=-1
//row 1
if(player1.contains(1) && player1.contains(2) && player1.contains(3)){ Winner=1 }
else if(player2.contains(1) && player2.contains(2) && player2.contains(3)){ Winner=2}
//row 2
if(player1.contains(4) && player1.contains(5) && player1.contains(6)){ Winner=1 }
else if(player2.contains(4) && player2.contains(5) && player2.contains(6)){Winner=2}
//row 3
if(player1.contains(7) && player1.contains(8) && player1.contains(8)){ Winner=1 }
else if(player2.contains(7) && player2.contains(8) && player2.contains(9)){Winner=2}
/////////////////////////////colums////////////////////////////////////////////////////
//colum 1
if(player1.contains(1) && player1.contains(4) && player1.contains(7)){ Winner=1 }
else if(player2.contains(1) && player2.contains(4) && player2.contains(7)){ Winner=2}
//colum 2
if(player1.contains(2) && player1.contains(5) && player1.contains(8)){ Winner=1 }
else if(player2.contains(2) && player2.contains(5) && player2.contains(8)){Winner=2}
//colum 3
if(player1.contains(3) && player1.contains(6) && player1.contains(9)){ Winner=1 }
else if(player2.contains(3) && player2.contains(6) && player2.contains(9)){Winner=2}
////////////////////////////////digonale//////////////////////////////////////
// main digonale
if(player1.contains(1) && player1.contains(5) && player1.contains(9)){ Winner=1 }
else if(player2.contains(1) && player2.contains(5) && player2.contains(9)){Winner=2}
//non-main digonale
if(player1.contains(3) && player1.contains(5) && player1.contains(7)){ Winner=1 }
else if(player2.contains(3) && player2.contains(5) && player2.contains(7)){Winner=2}
//Check Winner
if (Winner==1){ Toast.makeText(this,"Player 1 is Winner",Toast.LENGTH_LONG).show() }
else if(Winner==2){ Toast.makeText(this,"Player 2 is Winner",Toast.LENGTH_LONG).show() }
else if(Draw==9){Toast.makeText(this," Draw ",Toast.LENGTH_LONG).show()}
}AutoPlay函数当我编写此函数并运行应用程序并按下游戏中的任意按钮时发生错误
fun AutoPlay(){
var emptyCells= ArrayList<Int>()
for(cellId in 1..9 ) {
if ( !(player1.contains(cellId) || player2.contains(cellId)) ){
emptyCells.add(cellId)
}
}
val r= Random()
var randIndex=r.nextInt(emptyCells.size)
var cellId=emptyCells[randIndex]
val buSelected : Button?
buSelected=when(cellId){
1-> {button1}
2-> {button2}
3-> {button3}
4-> {button4}
5-> {button5}
6-> {button6}
7-> {button7}
8-> {button8}
9-> {button9}
else-> {button1}
}
PLayGame(cellId,buSelected)
}}
发布于 2020-11-02 03:21:26
当你想通过实现onClickListener接口向XML文件中的一个元素添加onClick动作时,你可以使用kotlin的android扩展也要记住将它作为apply plugin: kotlin-android-extensions添加到你的应用程序的build.gradle文件中,然后在你的活动中,你可以通过它的id访问你的元素,并添加on element_id.setOnClickListener{ onClickFunction()},然后你可以调用你的函数,比如example或者其他一些东西
发布于 2020-11-02 10:23:46
看看你的堆栈跟踪-它被组织成不同的级别,每个级别都是由下一个异常引起的异常。每个异常都有一个导致异常发生的方法调用列表(最上面的是最近的):
java.lang.IllegalStateException: Could not execute method for android:onClick
...
Caused by: java.lang.reflect.InvocationTargetException
...
Caused by: java.lang.IllegalArgumentException: n <= 0: 0
at java.util.Random.nextInt(Random.java:182)
at com.example.ticgame.MainActivity.AutoPaly(MainActivity.kt:132)
at com.example.ticgame.MainActivity.PLayGame(MainActivity.kt:55)
at com.example.ticgame.MainActivity.AutoPaly(MainActivity.kt:149)
at com.example.ticgame.MainActivity.PLayGame(MainActivity.kt:55)
...最后一个异常是重要的异常,如果你从下往上阅读,你可以看到导致异常的原因。最后发生的事情是PLayGame调用AutoPaly,后者调用Random.nextInt,该调用抛出一个异常,并显示以下消息:
java.lang.IllegalArgumentException: n <= 0: 0这说明您使用0值调用了Random.nextInt,如果该值为<= 0,则会抛出异常。调用它的代码(根据堆栈跟踪,MainActivity.kt的第132行,它告诉您在哪里查找;)正在执行以下操作:
var randIndex=r.nextInt(emptyCells.size)因此,在某个时刻,当大小为0时,emptyCells可能是空的,这就是它崩溃的原因。
https://stackoverflow.com/questions/64635150
复制相似问题