Kotlin开发Android端Flappy Bird游戏时Log.d调用两类报错问题求助
Kotlin开发Android时Log.d两类编译报错的直接修复方案
问题1:MainActivity中单参数调用Log.d触发签名不匹配
报错现场
在给播放按钮绑定点击事件时,写下如下代码:
ImageButton.setOnClickListener( Log.d(Tag) )
编译器直接抛错:
None of the following functions can be called with the arguments supplied.
d(String?, String) defined in android.util.Log
d(String?, String?, Throwable?) defined in android.util.Log
错在哪
android.util.Log的d方法压根没有单参数重载,所有可调用的版本都至少需要两个入参:第一个是日志TAG,第二个是要打印的日志文本,最多额外加一个Throwable参数打堆栈。只传一个TAG,根本匹配不到对应方法。- 就算把参数凑齐了,直接把
Log.d塞给setOnClickListener也是逻辑错误:这个方法需要的是点击事件监听器,Log.d的返回值是int类型,和监听器类型完全不兼容。
怎么修
- 给
Log.d补全要打印的内容参数 - 把日志调用放到点击事件的lambda回调里,等用户真点击按钮的时候再执行日志打印
修复后正确写法
val playBtn: ImageButton = findViewById(R.id.btnPlay) playBtn.setOnClickListener { // 点击触发时才执行日志 Log.d(Tag, "播放按钮被点击") }
问题2:PlayThread中带参数前缀的Log.d调用触发语法错误
报错现场
在游戏线程的run方法里写下代码:
Log.d(TAG, msg: "Thread Started")
编译器抛语法错:
Unexpected tokens (use ';' to separate expressions on the same line)
错在哪
Kotlin支持命名参数传值,但只有在需要跳过中间参数、不按顺序传值的时候才需要写参数名。这里两个参数按顺序传递,硬给第二个参数加个msg:的前缀,属于多余的非法标记,编译器解析不了就会报意外token的错。
怎么修
把多余的msg:删掉,按方法签名的顺序直接传入两个字符串参数即可。
修复后正确写法
override fun run() { Log.d(TAG, "Thread Started") // 后续游戏循环逻辑 }
内容的提问来源于stack exchange,提问作者YasuoMakamutchi
相关产品推荐
相关产品推荐

