java - 从 JAR 读取音频时出现 NullPointerException
问题描述
我试图制作一个可运行的 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
}
}
解决方案
您的声音文件inGame.wav
位于res
源目录中的一个目录中。
当您导出它时,源代码将被编译并复制到 JAR。
这导致声音文件位于res
JAR 内的子目录中。
您尝试读取文件inGame.wav
,但您必须改为读取res/inGame.wav
。
第二个问题是系统无法在InputStream
. 这可以通过更改getResourceAsStream
为来解决getResource()
。
AudioInputStream menuSound = AudioSystem.getAudioInputStream(AudioPlayer.class.getClassLoader().getResource("res/inGame.wav"));
推荐阅读
- sharepoint - 如何从 PowerApps 上的 SharePoint Online 列表中选择特定视图
- python - 如何使用 matplotlib 在单击和悬停时显示散点值?我是 matplotlib 的新手
- autohotkey - 如何在 Autohotkey 中将 CAPSLOCK 映射到 ESC 和 ESC 到 CAPSLOCK?
- c# - 当通过 datacontext 更改 selecteditem 时,WPF Combobox 正在旧对象上设置新对象的值
- java - 无效的 cookie 标头:Airtable
- excel - 如果不同列中同一行的 2 个单元格中的特定值
- jquery - 将整个列值显示为 jquery 数据表中的密码字段
- typescript - 如何推断泛型参数的属性类型并映射到另一种类型
- sql - 删除除非语句
- javascript - 如何将 JS 中的自定义事件用于 Angular 组件?