当前位置: 首页 > 知识库问答 >
问题:

AudioInputStream正在引发NullPointerException

蒲坚
2023-03-14

我一直在寻找一种方法从我的项目中导出一个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以流的形式打开文件时,它会抛出一个NullPointerException,即使URL之前有一个值。

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”,就不会发生这种情况,但是导出项目时找不到该文件。如果有另一种方式来导出一个项目,仍然可以播放音频文件,我想使用,如果它的工作。

共有1个答案

郏稳
2023-03-14

stackoverflow.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();
}
 类似资料:
  • 我是按照你的指示去做的https://www.docs4dev.com/javadoc/en/org/springframework/boot/spring-boot-test/2.2.2.RELEASE/org/springframework/boot/test/system/OutputCaptureRule.html 我将Maven与SpringBootStarter的父版本2.2一起使用。

  • 给定Java8代码 java中的Lambdas看起来对错误处理不太友好...

  • 问题内容: 我试图每次用户按下按钮时播放.wav声音,但是会引发异常: 这是代码: 问题答案: 我设法使其正常工作。这是我使用的代码。请记住,我只需要播放短的beep.wav声音。较长的声音文件似乎有些麻烦。让我知道它是否适合您,以及您是否可以使用此代码播放更长的声音。

  • 问题内容: 我想创建2个可以启动和停止背景音频的设备。 这是我的代码: 当我单击时,可以正常工作,可以播放音频。 但是,当我单击时,会出现错误,如果再次单击,将不会再有声音。 这是错误: 我的程序有什么错误? 问题答案: 此SSCCE在这里是“无效结果”,因为音频无例外地重新启动(尝试至少3次)。

  • 我正在实现自定义'AuthenticationProvider'。如果没有经过身份验证,我将在'authenticate'函数中抛出异常,如下所示。 我有全局异常处理程序,如下所示。 当在'authenticate'函数内部引发异常时,不会调用全局异常处理程序。对于所有其他例外情况,它正在被调用。我想在全局异常处理程序中捕获异常并返回自定义错误消息。我怎么能那样做?感谢任何帮助。提前道谢。

  • 我试图在处理过程中制作一个小型射击游戏,当我单击鼠标按钮时,我创建一些沿着屏幕移动的子弹,当它们离开屏幕时,它们应该消失,我使用一个在其中保存这样的值:,我的问题是,当我在下面的代码中尝试删除项目符号的索引时,我会随机得到一个异常,即使我在删除之前检查了IntList的大小。有什么帮助吗? 编辑: 我想我找到了一条线索:当我达到屏幕上有5个子弹时,异常总是会发生(此时,子弹的大小变成了10)。