在 Java 中停止和启动 Clip 时如何避免 NullPointerException?

How do I avoid a NullPointerException when stopping and starting a Clip in Java?

我正在 Java 制作游戏,我希望在背景中播放主题曲,但每次用户按下 minus 时音量都会降低。无论我尝试什么,除了我初始化 Clip 的方法之外,我都无法通过其他方法执行此操作,因为 cli.

这是我的 GameAudio 的代码 class:

public class GameAudio {
    private static float volume = -20.0f;
    private Clip clip;

    public GameAudio(String audioLocation) {
        try {
            File filePath = new File(audioLocation);

            if (filePath.exists()) {
                AudioInputStream audioInput = AudioSystem.getAudioInputStream(filePath);
                Clip clip = AudioSystem.getClip();
                clip.open(audioInput);
                FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
                gainControl.setValue(getVolume());
                clip.loop(Clip.LOOP_CONTINUOUSLY);
                clip.start();
            } else {
                System.out.println("Incorrect audio file path!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public float getVolume() {
        return volume;
    }

    public void setVolume(float volume) {
        GameAudio.volume = volume;
    }

    public void stopSound() {
        clip.stop();
        clip.close();
    }
}

在我的播放器中 class 我输入:

private String musicPath = "maintheme.wav";
GameAudio gameAudio = new GameAudio(musicPath);

然后再往下

if (input.minus.isPressed()) {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            gameAudio.stopSound();

            if (gameAudio.getVolume() <= -80.0f) {
                gameAudio.setVolume(-70.0f);
            }
            gameAudio.setVolume(gameAudio.getVolume() - 10.0f);
            System.out.println("Volume: " + gameAudio.getVolume());
        }

在调试模式下,空指针异常似乎来自 gameAudio.stopSound() 调用 clip.stop();和 clip.close(); 我怎样才能避免这种情况?

您的问题在这一行:

            Clip clip = AudioSystem.getClip();

这是创建一个局部变量,而不是将剪辑设置为您在下面使用的成员变量。

相反,尝试:

            clip = AudioSystem.getClip();