eclipse 尝试在java8中使用clip播放声音会抛出java.lang.NullPointerException

yptwkmov  于 2023-08-04  发布在  Eclipse
关注(0)|答案(1)|浏览(125)

我目前正在编写一个小游戏,并试图实现背景音乐。我对Java中的视觉/音频相当陌生,在网上做了一些研究后,我发现Clip将是一个与我如何处理图形兼容的选项。所以,我遵循了一个教程,介绍了如何设置/使用它,导致了这个'Sound'类:

import java.io.IOException;
import java.io.InputStream;
import javax.sound.sampled.*;

public class Sound implements LineListener {
    
    boolean isPlaybackCompleted;
    int playMode;
    
    public Sound(int mode) {
        playMode = mode; // 0 = background music
    }
    
    @Override
    public void update(LineEvent event) {
        if (LineEvent.Type.START == event.getType()) {
            isPlaybackCompleted = false;
            System.out.println("Playback started.");
        } else if (LineEvent.Type.STOP == event.getType()) {
            isPlaybackCompleted = true;
            System.out.println("Playback completed.");
        }
    }
    
    public void playSound(String soundName) throws LineUnavailableException, IOException, UnsupportedAudioFileException {
        InputStream inputStream = getClass().getClassLoader().getResourceAsStream("./Sounds/facilityIndoors.wav");
        AudioInputStream audioStream = AudioSystem.getAudioInputStream(inputStream);
        AudioFormat audioFormat = audioStream.getFormat();
        DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
        Clip audioClip = (Clip) AudioSystem.getLine(info);
        audioClip.addLineListener(this);
        audioClip.open(audioStream);
        audioClip.start();
        switch(playMode){
        case 0:
            if(isPlaybackCompleted == true) {
                
            }
        }
        audioClip.close();
        audioStream.close();
    }
}

字符串
(Note playSound的'soundName'参数是我希望以后实现的东西,这样我就可以基于与当前Map名称共享的变量在轨道之间切换,并且当前未使用,我刚刚硬编码了一个文件的路径,该文件现在已经存在用于测试)
在我的main中有示例化和函数调用

Sound music = new Sound(0);
        music.playSound(map.currentMap);


当我尝试调用playSound函数时,会抛出这个错误:

Exception in thread "main" java.lang.NullPointerException
    at java.base/java.util.Objects.requireNonNull(Objects.java:209)
    at java.desktop/javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1006)
    at Sound.playSound(Sound.java:37)
    at Program.main(Program.java:22)


一开始我以为我把文件路径拼写错了,但经过仔细检查,我的拼写似乎是正确的,如下所示:Image of file path and file name 'Global Research FacilityJava 8'是我的项目文件夹,我的图像引用似乎是从那个级别开始的,所以也许Clip不从项目文件夹开始,这可能是问题所在,但如果是,我不知道如何解决这个问题。
我试着检查文件路径中的拼写错误,并试着从一开始就省略了一些符号(例如“Sounds/facilityIndoors.wav”或“/Sounds/facilityIndoors.wav”),但错误仍然存在。在发布此之前检查可能重复的列表时,我还发现了一篇文章,谈论将我所有的资源文件夹放到一个“资源”文件夹中,并将其添加到构建路径中,我现在已经尝试过了,但无济于事,仍然抛出相同的错误。(文件路径现在为“resources/Sounds/facilityIndoors.wav”)

eulz3vhy

eulz3vhy1#

我也遇到过同样的问题,但我没有找到解决它的方法,而是决定通过将音频文件复制到PC上的某个位置来解决它。
尝试此代码复制文件

File audio = new File("C://somewhere//audio.wav").mkdir();
Files.copy(getClass().getResourceAsStream("resources/Sounds/facilityIndoors.wav"), Paths.get("C://somewhere//audio.wav"), StandardCopyOption.REPLACE_EXISTING);

字符串
现在只需要像这样使用audio文件

AudioInputStream audioStream = AudioSystem.getAudioInputStream(audio));
Clip audioClip  = AudioSystem.getClip();
audioClip.open(audioStream);

相关问题