NullPointerException从JAR读取音频

问题描述 投票:0回答:1

我试图制作可运行的JAR,但由于某种原因,我无法玩游戏。我做了一些研究,并通过命令提示符运行它来尝试查找错误,并在下面得到了此信息。所以很明显,我知道我只需要解决此问题。我是编程新手,所以不太确定这会告诉我什么。

Exception in thread "main" java.lang.NullPointerException
        at java.base/java.util.Objects.requireNonNull(Unknown Source)
        at java.desktop/javax.sound.sampled.AudioSystem.getAudioInputStream(Unknown Source)
        at builder.AudioPlayer.playMenuSound(AudioPlayer.java:20)
        at builder.Game.<init>(Game.java:56)
        at builder.Game.main(Game.java:61)
package builder;

import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;

public class AudioPlayer {

    private static Clip play;

    public static void playMenuSound()
    {
        try {
            //AudioInputStream menuSound = AudioSystem.getAudioInputStream(new File("src/res/introSong.wav")); //Take in audio from res folder
            AudioInputStream menuSound = AudioSystem.getAudioInputStream(AudioPlayer.class.getClassLoader().getResourceAsStream("res/introSong.wav"));
            play = AudioSystem.getClip(); //
            play.open(menuSound); //Play the sound
            FloatControl volume = (FloatControl) play.getControl(FloatControl.Type.MASTER_GAIN); //Get control of volume
            volume.setValue(1.0f); //0.0 - 1.0 volume
            play.loop(Clip.LOOP_CONTINUOUSLY); //Loop once clip is over
        }catch (LineUnavailableException | IOException | UnsupportedAudioFileException e){
            e.printStackTrace();
        }
    }

    public static void playGameSound()
    {
        try {
            //AudioInputStream gameSound = AudioSystem.getAudioInputStream(new File("src/res/inGame.wav")); //Take in audio from res folder
            AudioInputStream gameSound = AudioSystem.getAudioInputStream(AudioPlayer.class.getClassLoader().getResourceAsStream("res/inGame.wav"));
            play = AudioSystem.getClip(); //
            play.open(gameSound); //Play the sound
            FloatControl volume = (FloatControl) play.getControl(FloatControl.Type.MASTER_GAIN); //Get control of volume
            volume.setValue(0.5f); //0.0 - 1.0 volume
            play.loop(Clip.LOOP_CONTINUOUSLY); //Loop once clip is over
        }catch (LineUnavailableException | IOException | UnsupportedAudioFileException e){
            e.printStackTrace();
        }
    }

    public static void stopMusic()
    {
        play.close(); //Stop music
    }
}
java inputstream
1个回答
1
投票

您的声音文件inGame.wav位于源目录内的目录res中。

导出时,源将被编译并复制到JAR。

这导致声音文件位于JAR的子目录res中。

您尝试读取文件inGame.wav,但必须改为读取res/inGame.wav

第二个问题是系统无法在InputStream上设置标记。可以通过将getResourceAsStream更改为getResource()来解决。

AudioInputStream menuSound = AudioSystem.getAudioInputStream(AudioPlayer.class.getClassLoader().getResource("res/inGame.wav"));
© www.soinside.com 2019 - 2024. All rights reserved.