You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin音乐播放器Activity设置UI时lateinit变量未初始化报错求助

问题

开发一款音乐应用时,在播放器Activity中设置歌曲标题、专辑名及封面图片时出现lateinit变量未初始化报错,移除相关代码后功能正常运行。报错发生在通过musicList[songPosition].artUri获取歌曲信息的环节。

播放器Activity代码

import android.media.MediaPlayer
import android.os.Bundle
import android.widget.ImageButton
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.bumptech.glide.Glide
import com.bumptech.glide.request.RequestOptions
import com.google.android.material.imageview.ShapeableImageView

class musicInterface : AppCompatActivity() {

    lateinit var musicList: ArrayList<MusicClass>
    var songPosition: Int = 0
    var musicPlayer: MediaPlayer? = null

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

        val button: ImageButton = findViewById(R.id.backButton)
        button.setOnClickListener {
            onBackPressed()
        }

        setLayout()
        playSong()
    }

    private fun setLayout() {
        val image: ShapeableImageView = findViewById(R.id.interfaceCover)
        val title: TextView = findViewById(R.id.interfaceSongName)
        val album: TextView = findViewById(R.id.interfaceArtistName)

        Glide
            .with(this)
            .load(musicList[songPosition].artUri)
            .apply(RequestOptions.placeholderOf(R.drawable.image_as_cover).centerCrop())
            .into(image)

        title.text = musicList[songPosition].title
        album.text = musicList[songPosition].artist

    }

    private fun playSong() {
        songPosition = intent.getIntExtra("index", 0)
        when (intent.getStringExtra("class")) {
            "MusicAdapter" -> {
                musicList = ArrayList()
                musicList.addAll(MainActivity.songList)
                if (musicPlayer == null) musicPlayer = MediaPlayer()
                musicPlayer!!.reset()
                musicPlayer!!.setDataSource(musicList[songPosition].path)
                musicPlayer!!.prepare()
                musicPlayer!!.start()

            }
        }
    }
}

报错信息

Process: com.example.music, PID: 25937
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.music/com.example.music.musicInterface}: kotlin.UninitializedPropertyAccessException: lateinit property musicList has not been initialized
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3420)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3559)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:140)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2092)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:264)
    at android.app.ActivityThread.main(ActivityThread.java:7593)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:980)
 Caused by: kotlin.UninitializedPropertyAccessException: lateinit property musicList has not been initialized
    at com.example.music.musicInterface.getMusicList(musicInterface.kt:14)
    at com.example.music.musicInterface.setLayout(musicInterface.kt:42)
    at com.example.music.musicInterface.onCreate(musicInterface.kt:27)
    at android.app.Activity.performCreate(Activity.java:7805)
    at android.app.Activity.performCreate(Activity.java:7794)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1306)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3390)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3559) 
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:140) 
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:96) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2092) 
    at android.os.Handler.dispatchMessage(Handler.java:107) 
    at android.os.Looper.loop(Looper.java:264) 
    at android.app.ActivityThread.main(ActivityThread.java:7593) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:980) 

解决建议

核心问题

报错原因是方法调用顺序错误:onCreate中先执行了setLayout(),此时musicList还未被初始化——musicList的赋值逻辑在playSong()里,而playSong()是在setLayout()之后才调用的,导致setLayout()访问musicList时触发未初始化异常。

具体修复步骤

  1. 调整方法调用顺序:在onCreate中先调用playSong(),确保musicList和songPosition完成初始化后,再调用setLayout()更新UI。
  2. 增加安全检查:处理intent.getStringExtra("class")不等于"MusicAdapter"的情况,避免musicList始终未初始化的问题。
  3. 优化lateinit变量的安全访问:使用::musicList.isInitialized判断变量是否已初始化,再执行UI更新逻辑。

修改后的代码示例

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

    val button: ImageButton = findViewById(R.id.backButton)
    button.setOnClickListener {
        onBackPressed()
    }

    // 先初始化数据
    playSong()
    // 确认musicList初始化后再更新UI
    if (::musicList.isInitialized) {
        setLayout()
    } else {
        // 处理未初始化的异常情况,比如直接关闭当前页面
        finish()
    }
}

另外,也可以提前给musicList一个默认初始化,避免lateinit的潜在问题:

// 替换原来的lateinit声明
var musicList: ArrayList<MusicClass> = ArrayList()

这种方式可以省去isInitialized的检查,但需要注意后续赋值时的逻辑覆盖。

内容的提问来源于stack exchange,提问作者ShahZaman Rai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:35:23