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时触发未初始化异常。
具体修复步骤
- 调整方法调用顺序:在
onCreate中先调用playSong(),确保musicList和songPosition完成初始化后,再调用setLayout()更新UI。 - 增加安全检查:处理
intent.getStringExtra("class")不等于"MusicAdapter"的情况,避免musicList始终未初始化的问题。 - 优化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
相关产品推荐
相关产品推荐

