首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AudioInputStream正在抛出NullPointerException

AudioInputStream正在抛出NullPointerException
EN

Stack Overflow用户
提问于 2021-04-16 16:58:09
回答 1查看 33关注 0票数 0

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

代码语言:javascript
复制
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以流的形式打开文件时,它会抛出一个NullPointerException,即使该URL之前有一个值。

代码语言:javascript
复制
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"就不会发生这种情况,但是当我导出项目时就找不到文件了。如果有另一种方法可以导出项目,仍然可以播放音频文件,我想使用它,如果它工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-19 16:24:05

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

代码语言:javascript
复制
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();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67122193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档