AudioInputStream 正在抛出 NullPointerException

Posted

技术标签:

【中文标题】AudioInputStream 正在抛出 NullPointerException【英文标题】:AudioInputStream is throwing NullPointerException 【发布时间】:2021-04-16 08:58:08 【问题描述】:

我一直在寻找一种从我的项目中导出 JAR 文件的方法,无论它位于何处,它都能始终播放声音文件。为此,我编写了以下代码,该代码返回文件的确切路径。

public MouseHandler() 
    playSound("rsc/click.wav");

public void playSound(final String fileName) 
    File file = new File(fileName);
    try 
        URL fileUrl = file.toURI().toURL();
        String urls = fileUrl.toString();
        urls = urls.replaceFirst("file:/", "file:///");
        System.out.println(urls);
        Clip clip = Audiosystem.getClip();
        AudioInputStream inputStream = AudioSystem
                .getAudioInputStream(MouseHandler.class.getResourceAsStream(urls));
        clip.open(inputStream);
        clip.start();
     catch (Exception e) 
        e.printStackTrace();
    

当我让 AudioInputStream 将文件作为流打开时,即使 URL 之前有值,它也会抛出 NullPointerException。

file:///X:/workspace/eclipse/Minesweeper/rsc/click.wav
java.lang.NullPointerException
at java.base/java.util.Objects.requireNonNull(Objects.java:222)
at java.desktop/javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1006)
at configs.MouseHandler.playSound(MouseHandler.java:62)
[AudioInputStream inputStream = AudioSystem
                .getAudioInputStream(MouseHandler.class.getResourceAsStream(urls));]
at configs.MouseHandler.<init>(MouseHandler.java:45)
[playSound("rsc/click.wav");]
at configs.Button.<init>(Button.java:57)
at gui.Frame.<init>(Frame.java:81)
at start.Main.main(Main.java:13)

我知道如果我给 AudioInputStream "rsc/click.wav" 就不会发生这种情况,但是当我导出项目时找不到该文件。如果有其他方法可以导出仍然可以播放音频文件的项目,如果可行的话,我想使用它。

【问题讨论】:

***.com/tags/javasound/info 此链接有两个加载内容的示例:通过远程 URL,或从包含在 jar 中的文件。 【参考方案1】:

***.com/tags/javasound/info 的解决方案对我有用,非常感谢!

public void playSound(final URL fileName) throws Exception 

        new Thread(new Runnable() 
        public void run() 
            try 
                AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(fileName);
                AudioFormat audioFormat = new AudioFormat(Encoding.PCM_SIGNED, 44100, 16, 2, 4, 44100, false);
                Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
                SourceDataLine sourceDataLine = (SourceDataLine) AudioSystem.getLine(info);
                sourceDataLine.open(audioFormat);
                int bytesRead = 0;
                byte[] buffer = new byte[1024];
                sourceDataLine.start();
                while ((bytesRead = audioInputStream.read(buffer)) != -1) 
                    sourceDataLine.write(buffer, 0, bytesRead);
                
                sourceDataLine.drain();
                sourceDataLine.stop();
             catch (Exception e) 
                System.err.println(e.getMessage());
            
        
    ).start();

【讨论】:

以上是关于AudioInputStream 正在抛出 NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

NoSuchMethodError:nul 上的无效成员:“_set”

来自套接字的“无尽”AudioInputStream

如何从 InputStream 转换为 AudioInputStream

从原始文件中获取最多 x 个字节的 AudioInputStream(剪切音频文件)

Java 中的声音:可以为多个剪辑使用相同的 AudioInputStream 吗?

关于java AudioInputStream播放短音频没声音的问题