You need to enable JavaScript to run this app. Kotlin开发Android端Flappy Bird游戏时Log.d调用两类报错问题求助
优惠活动
大模型
产品
解决方案
定价
更多

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类型,和监听器类型完全不兼容。

怎么修

  1. 给Log.d补全要打印的内容参数
  2. 把日志调用放到点击事件的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.02 20:06:05