为什么在尝试实例化 Mediaplayer 时会出现 NullPointerException? Android 科特林

Why do I get NullPointerException when trying to instantiate Mediaplayer? Android Kotlin

package com.oyly.gpsdemo
import android.content.Context
import android.media.MediaPlayer

class SoundGenerator(context: Context) : MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener {
    private var mediaPlayer:    MediaPlayer = MediaPlayer()
    private var nextSound:      Int = R.raw.coast

    init {
        try { mediaPlayer = MediaPlayer.create(context, R.raw.coast) }
        catch (ex : Exception) { println("lyseoy11: $ex") }
            mediaPlayer.setOnPreparedListener(this)
            mediaPlayer.setOnCompletionListener (this)
    }
        override fun onPrepared(p0: MediaPlayer) {mediaPlayer.start()}
        override fun onCompletion(p0: MediaPlayer?) { playSound() }
        fun queueSound(resid: Int) {
            nextSound = resid
            if (!mediaPlayer.isPlaying) playSound()
        }
        fun playSound() {
            mediaPlayer.reset()
            mediaPlayer.setDataSource(resources.openRawResourceFd(nextSound))
            mediaPlayer.prepareAsync()
        }
}

“mediaPlayer = MediaPlayer.create(context, R.raw.coast”行抛出以下异常:

java.lang.NullPointerException: 尝试在空对象引用

上调用虚拟方法'android.content.res.Resources android.content.Context.getResources()'

我已将这段代码从它运行的独立应用程序移到另一个应用程序的 class 中。现在它不起作用,我不明白为什么。 MediaPlayer.Create() 方法将上下文作为参数(我从调用此 class 的 MainActivity class 传递)和要播放的音频文件的 uri。它们都不为空。

为什么我会得到这个异常?

编辑:

唯一创建 SoundGenerator 的地方是在 MainActivity Initializer 中:

class MainActivity : AppCompatActivity() {
    private             var soundGenerator : SoundGenerator = SoundGenerator(this)
    ...
}

通常,最好等到生命周期的后期(例如在 onCreate 中)设置好之后再使用 activity 作为上下文,以避免初始化顺序问题。例如:

class MainActivity : AppCompatActivity() {
    private lateinit var soundGenerator : SoundGenerator

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //...
        soundGenerator = SoundGenerator(this)
    }
}

或者,有时您可以使用 applicationContext 而不是当前的 activity 作为合适的上下文。