Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中停止和启动剪辑时如何避免NullPointerException?_Java_Oop_Audio_Nullpointerexception_Javax.sound.sampled - Fatal编程技术网

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

在Java中停止和启动剪辑时如何避免NullPointerException?,java,oop,audio,nullpointerexception,javax.sound.sampled,Java,Oop,Audio,Nullpointerexception,Javax.sound.sampled,我正在用Java制作一个游戏,我想在后台播放一首主题曲,但每次用户按下减号时,音量就会减小。无论我尝试什么,除了初始化剪辑的方法外,我无法从其他方法执行此操作,因为cli 这是我的GameAudio类的代码: public class GameAudio { private static float volume = -20.0f; private Clip clip; public GameAudio(String audioLocation) { t

我正在用Java制作一个游戏,我想在后台播放一首主题曲,但每次用户按下减号时,音量就会减小。无论我尝试什么,除了初始化剪辑的方法外,我无法从其他方法执行此操作,因为cli

这是我的GameAudio类的代码:

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();
    }
}
在我的玩家课上,我把:

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();

非常感谢!我不知道我怎么会错过它,花了几个小时试图修复它而没有尝试lol。我还必须创建一个方法来再次启动音频,因为显然我忘记了,它只是停止了音频。非常有帮助!:@瓦奇夫棒极了!请勾选答案左侧的箭头,将此问题标记为已回答