【发布时间】:2017-12-04 02:20:35
【问题描述】:
我正在编写一个带有音乐和音效的视频游戏。在我测试过的 3/4 机器上,一切运行顺利。在另一台机器上,加载任何类型的声音文件都会产生这个异常:
我只对音乐曲目进行了堆栈跟踪,但游戏使用的所有声音都会出现此错误(正如您在终端中看到的“嗡嗡声”音效)。 NullPointerException 只是因为没有正确加载声音而被抛出。这是导致IllegalArgumentException 的代码:
try{
c=AudioSystem.getClip();
c.open(AudioSystem.getAudioInputStream(new File("Resources/Songs/"+name+".wav")));
}catch(Exception e){
System.out.println("Song name not recognized: "+name);
e.printStackTrace();
}
忽略“歌曲名称无法识别”位,这通常由FileNotFoundException 调用,如果我在其他地方打错字,这很有帮助。
以下是我所知道的:
1. 这个故障与声音的长度无关,因为它对于 5 分钟的歌曲和 1 秒的音效都失败了。
2.此故障可能是由于AudioSystem.getClip()在某些规格的系统上失败,系统无法打开剪辑造成的。 (https://bugs.openjdk.java.net/browse/JDK-7026275)
无论系统规格如何,如何防止这种情况发生?或者这完全是由其他原因引起的? 发生这种情况的机器是我朋友的,因此我无法立即访问她的计算机。
【问题讨论】:
-
包含错误消息作为文本。
-
通常我会,但正如我所说,这发生在朋友的电脑上,她给我发了一张截图
-
检查this answer。它可能会有所帮助。
-
空指针异常不是问题所在。这只是音频文件未缓冲到代码中的结果。问题出在我发布的代码中。它给出了一个空指针,因为稍后游戏会调用要播放的音乐,并且通常可以预期
Clip会被加载,但事实并非如此。 -
这里出了点问题。您不应该从paintComponent 方法调用
gameTick。您无法控制调用paintComponent 的频率——底层系统可能会为单个曝光事件多次调用它,或者可能会调用它以响应鼠标在组件上的移动。